ASP.NET MVC授权具有许多角色的用户

Her*_*rno 16 c# asp.net security asp.net-mvc authorization

我需要在我的ASP.NET MVC应用程序中向具有两个角色的用户授权Controller.我正在使用这样的Authorize属性:

[授权(角色="制片人,编辑")]

但这允许生产者和编辑到控制器.我只希望允许用户同时拥有这两种角色,而不仅仅是其中之一.

我怎么能得到这个?

Mol*_*mby 23

正如问题所述,当在单个呼叫中给出多个角色时,它们被应用,使得如果用户属于列出的任何角色,则他们将被授予访问权限; 像一个逻辑运算符. Authorize()OR

或者,要实现逻辑AND运算符的效果,可以多次应用该Authorize属性.例如..

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

对于上面的示例,只有属于角色ProducerEditor角色的用户才能访问操作主体.

Rudi在评论中指出,这可以让您创建一些相当复杂的访问规则,而无需实现自定义AuthorizeAttribute.例如,在下面的代码中,用户可以执行操作,如果它们是:a)在Enabled角色中,b)在EditorAdmin角色中.

[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
}
Run Code Online (Sandbox Code Playgroud)

我不确定哪个版本带来了这个版本,但它至少适用于MVC 4和5.

  • 这是一个更好的解决方案,也允许更复杂的场景,如`[Authorize(Roles ="EitherThis,OrThis")] [Authorize(Roles ="ButAlwaysThis")]` (2认同)

Cos*_*min 9

你应该做自定义 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
  }

}
Run Code Online (Sandbox Code Playgroud)

演示:

[AuthorizeMultiple(MultipleRoles ="Role1,Role2")]
public class UserController{
}
Run Code Online (Sandbox Code Playgroud)