ASP.NET MVCアプリケーションのコントローラーを、2つの役割を持つユーザーに承認する必要があります。私は次のようなAuthorize属性を使用しています:
[Authorize(Roles = "Producer、Editor")]
しかし、これにより、プロデューサーとエディターはコントローラーにアクセスできます。どちらか一方だけではなく、両方の役割を持つユーザーのみを許可したい。
どうすればこれを達成できますか?
質問にあるように、複数のロールが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で動作します。
カスタム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{
}