Personalizzazione dell’authorization in ASP.NET MVC

La mia class Controller è decorata con un AuthorizeAttribute per proteggere le azioni:

[Authorize(Roles = "User Level 2")] public class BuyController : Controller { ... } 

Ogni volta che viene invocata un’azione ma l’utente non ha almeno il ruolo “Livello utente 2” viene automaticamente reindirizzato alla pagina di accesso con una url come questa:

http: // localhost: 1436 / account / Accedi ReturnUrl =% 2fBuy

Se l’utente ha già effettuato l’accesso, ma non ha il livello di sicurezza corretto, questo non è un comportamento ottimale! Avrebbe più senso visualizzare una pagina che informa l’utente del livello mancante invece di mostrare la pagina di accesso.

Cosa posso fare per personalizzare questo comportamento? È ansible passare in qualche modo il livello utente richiesto all’azione Login?

    Puoi creare il tuo attributo autorizza in questo modo:

     public class ClubAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] }, { "controller", "Account" }, { "action", "Login" }, { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } }); } } } 

    Ho usato questo per redirect a un club specifico in un sito di affiliazione di club che sto costruendo. Potresti adattare questo alle tue necessità. A proposito, nel mio caso reindirizzamento alla pagina di accesso, ma controllo se l’utente è autorizzato e, in tal caso, visualizza un messaggio che non dispone delle autorizzazioni corrette. Senza dubbio potresti anche aggiungere qualcosa a ViewData o TempData da visualizzare sulla pagina, ma non l’ho provato

    EDIT AuthorizationContext.Cancel non esiste più in RC. “filterContext.Result is HttpUnauthorizedResult” sembra essere sufficiente: cosa è successo a filterContext.Cancel (ASP.NET MVC)

    Il tempo è passato da tempo dall’ultima risposta.

    Dal 2009 sono stati fatti molti progressi nello spazio di authorization. In particolare, OASIS (quelli dietro SAML) ha standardizzato XACML, l’eXtensible Access Control Markup Language.

    XACML offre agli sviluppatori:

    • un modello di utilizzo
    • un’architettura
    • un linguaggio di politica di authorization flessibile

    XACML è in linea con il controllo degli accessi basato su attributi che il NIST raccomanda di adottare nelle applicazioni al giorno d’oggi.

    Dai un’occhiata a questa risposta per maggiori dettagli.