2013-06-24 3 views
16

У меня возникли проблемы с указанием двух отдельных атрибутов авторизации для метода класса: пользователю разрешен доступ, если любой из двух атрибутов является истинным.Множественные атрибуты авторизации по методу

Athorization класс выглядит следующим образом:

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] 
public class AuthAttribute : AuthorizeAttribute { 
. . . 

и действие:

[Auth(Roles = AuthRole.SuperAdministrator)] 
[Auth(Roles = AuthRole.Administrator, Module = ModuleID.SomeModule)] 
public ActionResult Index() { 
    return View(GetIndexViewModel()); 
} 

Есть ли способ решить эту проблему или мне нужно пересмотреть свой подход?

Это должно быть запущено в MVC2.

ответ

21

Несколько экземпляров AuthorizeAttribute обрабатываются MVC, как если бы они были соединены с AND. Если вам нужно поведение OR, вам нужно будет реализовать свою собственную логику проверок. Предпочтительно реализовать AuthAttribute для выполнения нескольких ролей и выполнить собственную проверку с помощью логики OR.

Другим решением является использование стандарта AuthorizeAttribute и реализация пользовательского IPrincipal, который будет реализовывать метод bool IsInRole(string role) для обеспечения поведения «ИЛИ».

Пример здесь: https://stackoverflow.com/a/10754108/449906

+0

Можно ли создать еще один атрибут авторизации (т.е. ' public class MultipleAuthOrAttribute {'), который принимает в качестве входных данных несколько' AuthAttributes'? – adamse

+2

Вы не можете создать атрибут, который принимает экземпляры других атрибутов. Конструктор класса атрибутов может принимать только допустимые значения/исходные типы времени компиляции. Вот почему 'AuthorizeAttribute' принимает роли как строку. –

+1

Может ли кто-нибудь предоставить ссылку на официальную документацию, которая поддерживает утверждение, что несколько экземпляров 'AuthorizeAttribute' обрабатываются как логические' AND'. В моих собственных тестах кажется, что порядок фильтров важен, причем первый фильтр имеет последнее сообщение о том, прошла ли проверка подлинности. –

19

Существует лучший способ сделать это в более поздних версиях asp.net вы можете сделать как OR и AND ролей. Это делается по соглашению, перечисляя несколько ролей в одном авторизованном режиме, будет выполнять OR, где будет добавлено несколько атрибутов авторизации AND.

ИЛИ пример

[Authorize(Roles = "PowerUser,ControlPanelUser")] 

И Пример

[Authorize(Roles = "PowerUser")] 
[Authorize(Roles = "ControlPanelUser")] 

Вы можете найти более подробную информацию по этому вопросу по следующей ссылке https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles

Смежные вопросы