ASP.NET MVC Авторизовать пользователя со многими ролями

Мне нужно авторизовать контроллер в моем приложении ASP.NET MVC для пользователей, которые имеют две роли. Я использую атрибут Authorize следующим образом:

[Авторизовать (Роли = "Продюсер, Редактор" )]

Но это позволяет производителям и редакторам контроллер. Я хочу только разрешить пользователям, имеющим две роли, а не только одну из них.

Как я мог добиться этого?

Ответы

Ответ 1

Как говорится в вопросе, когда несколько ролей передаются в одном вызове Authorize(), они применяются таким образом, что если пользователь принадлежит к любой из перечисленных ролей, им будет предоставлен доступ; как логический оператор OR.

В качестве альтернативы для достижения эффекта логического оператора AND вы можете применять атрибут Authorize несколько раз. Например..

[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.

Ответ 2

Вы должны сделать свой собственный 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{
}