2017-11-30 3 views
0

既存のクラスを変更して、あるメソッドが異なるロールを許可し、他のメソッドがそのロールを持たないようにします。クラス内のメソッドの異なるロール

[Authorize("addedit, admin")] 
public class JobsController : BaseODataController<Job> 
{ 
    //This method needs to allow one more role! 
    public Job Get(int Id) 
    { 
     //stuff 
    } 

    public IHttpActionResult Post(Job job) 
    { 
     //stuff 
    } 

    public IHttpActionResult Update(int id) 
    { 
     //stuff 
    } 
} 

問題は、このロールを追加することで、クラスレベルで追加する必要があり、このロールがこのクラスのすべてのメソッドにアクセスできるようになります。私はこの役割がクラスにアクセスすることを望んでいますが、この方法を使うことができます。この作品を作るための最も簡単な方法は、クラスレベルで属性を削除して持つことである -

[Authorize("addedit, admin, newrole")] 
public Job Get(int Id) 
{ 
    //stuff 
} 

[Authorize("addedit, admin")] 
public IHttpActionResult Post(Job job) 
{ 
    //stuff 
} 

しかし現実には、このクラスでは、実際にはそれほどそれぞれに対してこれを行うことは厄介で、多くの異なる方法があります。これを実行したり、このメソッドを自分のクラスに分割したりすることなく、このクラスへのアクセスを許可する方法はありますか?

+0

コントローラレベルで[Authorize( "addedit、admin")] 'を残し、特定のActionで[Authorize(" addedit、admin、newrole ")]を追加するとどうなりますか? –

+0

ユーザーは「newrole」しか持たないため、クラスレベルでの権限を超えないため、これは機能しません。 – user3407039

+0

1つのコントローラに非常に多くのメソッドがある場合、コントローラを分割しないのはなぜですか? [Route]を使用すると、他のマップポイントを同じエンドポイントにマップすることはできますが、各ユーザーグループに対してコントローラを作成することができます。コントローラーを静的にすることさえできますか? – Dragonvil

答えて

0

実際には、デフォルトのAuthorize属性で実行する方法はありません。要するに、あなたはそのようなものを探しています。

[MyAuthorize(Roles = "addedit, admin", Except = "Get")] 
public class JobsController : BaseODataController<Job> 
{ 
    [MyAuthorize(Roles = "addedit, admin, newrole")] 
    public Job Get(int Id) 
    { 
     //stuff 
    } 

    public IHttpActionResult Post(Job job) 
    { 
     //stuff 
    } 

    public IHttpActionResult Update(int id) 
    { 
     //stuff 
    } 
} 

あなたはそれのためにあなたのカスタム派生承認属性を提供する必要があります。

実際に実際にロールをチェックする場合は、別のオプションは[AllowAnonymous]です。何かのようなもの;

[Authorize("addedit, admin")] 
public class JobsController : BaseODataController<Job> 
{ 
    [AllowAnonymous] 
    public Job Get(int Id) 
    { 
     //Check the roles (addedit, admin, newrole) manually 

     //stuff 
    } 

    public IHttpActionResult Post(Job job) 
    { 
     //stuff 
    } 

    public IHttpActionResult Update(int id) 
    { 
     //stuff 
    } 
} 
関連する問題