Jak uzyskać niestandardowe atrybuty adnotacji dla akcji kontrolera w ASP.NET MVC 4?
Pracuję z systemem autoryzacji opartym na zezwoleniach dla mojej aplikacji w ASP.NET MVC. W tym celu utworzyłem niestandardowy atrybut autoryzacji
public class MyAuthorizationAttribute : AuthorizeAttribute
{
string Roles {get; set;}
string Permission {get; set;}
}
dzięki czemu mogę autoryzować użytkownika zarówno rolą, jak i konkretnym kluczem uprawnień z adnotacją dla akcji takich jak
public class UserController : Controller
{
[MyAuthorization(Roles="ADMIN", Permissions="USER_ADD")]
public ActionResult Add()
[MyAuthorization(Roles="ADMIN", Permissions="USER_EDIT")]
public ActionResult Edit()
[MyAuthorization(Roles="ADMIN", Permissions="USER_DELETE")]
public ActionResult Delete()
}
następnie nadpisuję metodę AuthorizeCore () w klasie MyAuthorizationAttribute z podobną logiką (pseudo kod)
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(user not authenticated)
return false;
if(user has any role of Roles)
return true;
if(user has any permission of Permissions)
return true;
return false;
}
Do tego działa dobrze.
Teraz potrzebuję pewnego rodzaju metod rozszerzeń, aby móc dynamicznie generować adres URL akcji na stronach widoku, które zwrócą adres URL akcji na podstawie logiki autoryzacji atrybutu MyAuthorization dla danej akcji. Lubić
@Url.MyAuthorizedAction("Add", "User")
zwróci adres URL do „Użytkownik / Dodaj”, jeśli użytkownik ma rolę administratora lub ma uprawnienie „USER_ADD” (zdefiniowane w atrybutach dla akcji) lub zwraca pusty łańcuch w przeciwnym razie.
Ale po kilku dniach wyszukiwania w Internecie nie mogłem tego zrozumieć. :(
Jak dotąd znalazłem tylko toLink działania „Świadomy bezpieczeństwa”? który działa poprzez wykonanie wszystkich filtrów akcji dla akcji, aż się nie powiedzie.
To miłe, ale myślę, że wykonanie wszystkich filtrów akcji za każdym razem, gdy wywołam metodę MyAuthorizedAction (), będzie nadwyżką. Poza tym nie działa również z moją wersją (MVC 4 i .NET 4.5)
Wszystko, czego potrzebuję, to sprawdzić rolę uwierzytelnionego użytkownika, uprawnienia (będą przechowywane w sesji) pod kątem autoryzowanej roli i pozwolenia na daną akcję. Jak coś takiego jak poniżej (pseudo kod)
MyAuthorizedAction(string actionName, string controllerName)
{
ActionObject action = SomeUnknownClass.getAction(actionName, controllerName)
MyAuthorizationAttribute attr = action.returnsAnnationAttributes()
if(user roles contains any in attr.Roles
or
user permissions contains any attr.Permissions)
{
return url to action
}
return empty string
}
Poszukuję rozwiązania polegającego na uzyskiwaniu wartości atrybutów akcji przez dość długi czas, nie mogłem w ogóle znaleźć wystarczających zasobów. Czy brakuje mi odpowiednich słów kluczowych? : /
Jeśli ktoś może zapewnić mi rozwiązanie, które byłoby naprawdę wielką pomocą. Z góry dziękuję za rozwiązania