2013-08-05 12 views
6

Czekam na ponowne wykorzystanie moich aktualnie zdefiniowanych atrybutów autoryzacji kontrolera/działania, które określają role dostępu użytkownika do wyświetlania pozycji menu (tak, że użytkownik widzi tylko pozycje menu, do których ma dostęp).Ponowne użycie uprawnień kontrolera MVC do wyświetlania pozycji menu

Obecnie wyświetlanie pozycji menu i autoryzacja kontrolera/akcji są różne, więc wszelkie zmiany wymagają aktualizacji w dwóch miejscach, co może być podatne na błędy w przyszłości.

czekałem na zamówienie Autoryzacja atrybutów, i to, co mam tak daleko:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) 
     { 
      return false; 
     } 

     var routeData = httpContext.Request.RequestContext.RouteData; 
     string currentAction = routeData.GetRequiredString("action"); 
     string currentController = routeData.GetRequiredString("controller"); 

     var currentUserRoles = GetCurrentUserRoles(); 

     // from the list of menu items, find the menu item with the current action 
     // and controller and check the current user's roles entitle access 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary(
       new 
       { 
        controller = "Error", 
        action = "Unauthorised" 
       }) 
      ); 
    } 
} 

elementów menu są zasadniczo składał się z ról użytkowników pozycja menu jest dostępne, etykiety tekstowej na wyświetlaczu frontend i URL od kontrolera i działania. MenuItems są renderowane w częściowym widoku w zależności od tego, czy bieżący użytkownik jest w wymaganej roli do wyświetlenia MenuItem.

Z tego co widzę, potrzebuję wyczerpującej listy wszystkich działań kontrolerów i powiązanych ról użytkowników, które będą ponownie wykorzystywane w obu obszarach, czy istnieje bardziej elegancki sposób na osiągnięcie tego?

Odpowiedz

3

Po dalszych badaniach natknąłem się na pakiet nuget AuthorizedActionLink. Zasadniczo jest to pomocnik HTML oparty na ActionLink, który wyświetla linki tylko wtedy, gdy użytkownik ma dostęp do akcji kontrolera docelowego (patrz https://authorizedactionlink.codeplex.com/).

Więc zamiast używać @Html.ActionLink(), używam po prostu @Html.AuthorizedActionLink(), a menu jest zbudowane na podstawie uprawnień użytkownika określonych na poziomie kontrolera/akcji :).

Istnieje również @Html.ActionIsAccessibleToUser(actionName, controllerName), więc znaczniki otaczające łącza, takie jak <li> można pominąć.

0

Najlepszym sposobem byłoby umieszczenie logiki autoryzacji w oddzielnej klasie i użycie jej w różnych miejscach, np. CustomAuthorize, ograniczenia elementów menu. W ten sposób nie narusza DRY.