2013-08-05 7 views
6

Sto cercando di riutilizzare gli attributi Autorizzazione controller/azione attualmente definiti che specificano i ruoli di accesso utente per la visualizzazione di voci di menu (in modo che un utente veda solo le voci di menu a cui ha accesso).Reuse MVC Controller Roles Autorizzazione per la visualizzazione delle voci di menu

Attualmente la visualizzazione delle voci di menu e dei ruoli di attributo autorizza controller/azione sono distinti, quindi eventuali modifiche richiederebbero l'aggiornamento in due punti, che potrebbero essere soggetti a errori in futuro.

ho cercato in personalizzati Autorizza attributi, e questo è quello che ho finora:

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" 
       }) 
      ); 
    } 
} 

MenuItems sono essenzialmente costituiti dei ruoli utente la voce di menu è disponibile per, un'etichetta testuale per la visualizzazione frontend e l'url dal controller e l'azione. I MenuItem vengono visualizzati in una vista parziale a seconda che l'utente corrente abbia il ruolo richiesto per visualizzare l'oggetto MenuItem.

Da quello che vedo, potrei aver bisogno di un elenco completo di tutte le azioni del controller e dei ruoli utente associati da riutilizzare in entrambe le aree, esiste un modo più elegante per raggiungere questo obiettivo?

risposta

3

Dopo ulteriori ricerche, mi sono imbattuto nel pacchetto nuget AuthorizedActionLink. Essenzialmente si tratta di un Helper HTML basato su ActionLink, che visualizzerà solo i collegamenti se l'utente ha accesso all'azione del controller di destinazione (vedere https://authorizedactionlink.codeplex.com/).

Quindi, anziché utilizzare @Html.ActionLink(), è sufficiente utilizzare @Html.AuthorizedActionLink() e il menu è creato dai privilegi utente specificati a livello di controller/azione :).

C'è anche @Html.ActionIsAccessibleToUser(actionName, controllerName) quindi il markup che circonda i collegamenti, come ad esempio <li>, può essere omesso.

0

Il modo migliore sarebbe mettere la logica di autorizzazione in una classe separata e utilizzarla in luoghi diversi, ad es. Autorizzazione personalizzata, restrizione delle voci di menu. In tal modo nessuna violazione di DRY.

Problemi correlati