web-dev-qa-db-ja.com

ASP.NET MVCは多くの役割を持つユーザーを承認します

ASP.NET MVCアプリケーションのコントローラーを、2つの役割を持つユーザーに承認する必要があります。私は次のようなAuthorize属性を使用しています:

[Authorize(Roles = "Producer、Editor")]

しかし、これにより、プロデューサーとエディターはコントローラーにアクセスできます。どちらか一方だけではなく、両方の役割を持つユーザーのみを許可したい。

どうすればこれを達成できますか?

16
Herno

質問にあるように、複数のロールsingleAuthorize()の呼び出しで指定されると、ユーザーがanyリストされているロールのうち、アクセスが許可されます。論理OR演算子のように。

または、論理的なAND演算子の効果を実現するために、Authorize属性multiple timesを適用できます。例えば..

[Authorize(Roles = "Producer")]
[Authorize(Roles = "Editor")]
public ActionResult Details(int id) {
    // Only available to users who are Producers AND Editors
}

上記の例では、ProducerおよびEditorロールに属するユーザーのみがアクション本文にアクセスできます。

Rudiはコメントで指摘しています。これにより、カスタムAuthorizeAttributeを実装する必要なく、かなり複雑なアクセスルールを作成できます。たとえば、以下のコードでは、ユーザーは次の両方の場合にアクションを実行できます:a)Enabledロールで、b)EditorまたはAdminロールで。

[Authorize(Roles = "Enabled")]
[Authorize(Roles = "Editor,Admin")]
public ActionResult Details(int id) {
    // Only available to users who are Enabled AND either an Admin OR an Editor
}

どのバージョンがこれをもたらしたかはわかりませんが、少なくともMVC 4および5で動作します。

24
Molomby

カスタムAuthorizeAttributeを実行する必要があります

public class AuthorizeMultipleAttribute : AuthorizeAttribute
{

   //Authorize multiple roles
   public string MultipleRoles { get; set; }

  protected override bool AuthorizeCore(HttpContextBase httpContext)
  {
      var isAuthorized = base.AuthorizeCore(httpContext);
      if (!isAuthorized)
      {                
        return false;
      }

      //Logic here
      //Note: Make a split on MultipleRoles, by ','
      //User is in both roles => return true, else return false
  }

}

デモ :

[AuthorizeMultiple(MultipleRoles ="Role1,Role2")]
public class UserController{
}
9
Cosmin