2013-06-24 15 views
16

Mam problem z określeniem dwóch oddzielnych atrybutów autoryzacji dla metody klasy: użytkownik ma mieć dostęp, jeśli jeden z dwóch atrybutów jest prawdziwy.Wiele atrybutów autoryzacji dla metody

klasa

Athorization wygląda następująco:

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

i działanie:

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

Czy istnieje sposób, aby rozwiązać ten problem lub muszę przemyśleć moje podejście?

Należy uruchomić w MVC2.

Odpowiedz

21

Wiele instancji AuthorizeAttribute jest przetwarzanych przez MVC tak, jakby były połączone z AND. Jeśli chcesz zachować zachowanie OR, musisz zaimplementować własną logikę do sprawdzania. Najlepiej wdrożyć AuthAttribute, aby wziąć wiele ról i wykonać własną kontrolę z logiką OR.

Innym rozwiązaniem jest użycie standardu AuthorizeAttribute i wdrożenie niestandardowego IPrincipal, który wdroży metodę bool IsInRole(string role), aby zapewnić zachowanie "OR".

Przykładem jest tutaj: https://stackoverflow.com/a/10754108/449906

+0

byłoby możliwe, aby utworzyć kolejny atrybut Authorization (czyli ' public class MultipleAuthOrAttribute {'), który jako dane wejściowe przyjmie kilka' AuthAttributes'? – adamse

+2

Nie można utworzyć atrybutu, który pobiera instancje innych atrybutów. Konstruktor klas atrybutu może akceptować tylko prawidłowe wartości/typy pierwotne w czasie kompilacji. Dlatego 'AuthorizeAttribute' przyjmuje Role jako ciąg znaków. –

+1

Czy ktoś może podać odniesienie do oficjalnej dokumentacji, która obsługuje stwierdzenie, że wiele instancji 'AuthorizeAttribute' jest przetwarzanych jako logiczne' AND'. W moich własnych testach okazuje się, że kolejność filtrów jest ważna, a pierwszy filtr ma ostateczny wpływ na to, czy uwierzytelnianie powiedzie się. –

19

Istnieje lepszy sposób to zrobić w nowszych wersjach asp.net można wykonać obie lub ai na role. Odbywa się to poprzez konwencję, wymieniając wiele ról w jednej autoryzacji, która wykonuje operację LUB, w której dodanie wielu atrybutów autoryzacji będzie wykonywać ORAZ.

LUB przykład

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

i Przykład

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

można znaleźć więcej informacji na ten temat w poniższym linku https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles

Powiązane problemy