Nello script precedente, abbiamo visto come l'action filter Authorize sia utile per applicare in maniera automatica delle restrizioni alle azioni che un utente può eseguire e, nel caso questi non risulti abilitato, rimandarlo alla pagina di autenticazione.
Nel caso in cui però l'utente risulti già autenticato, questo comportamento di default corre il rischio di essere percepito più come un malfunzionamento della login del sito che non come conseguenza della mancanza delle autorizzazioni necessarie. Fortunatamente ASP.NET MVC è assolutamente personalizzabile anche in questo aspetto, e per farlo è sufficiente creare una nuova classe che erediti da AuthorizeAttribute ed effettuare l'override del metodo OnAuthorization:
public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!this.AuthorizeCore(filterContext.HttpContext)) { // se l'utente è autenticato, rimandiamo alla view // in cui si indica che non ha abbastanza privilegi if (filterContext.HttpContext.User.Identity.IsAuthenticated) { filterContext.Result = new RedirectResult("~/Unauthorized"); } else { filterContext.Result = new HttpUnauthorizedResult(); } } } }
In questo nostro filtro custom, ad esempio, dapprima invochiamo il metodo AuthorizeCore per verificare se l'utente ha sufficienti permessi per eseguire l'azione. Nel caso in cui la verifica fallisca, se questi risulta comunque autenticato, viene effettuato un redirect verso una pagina di cortesia, in cui magari possono essere spiegate le ragioni del divieto; solo in presenza di utente anonimo, invece, verrà seguito il comportamento standard, rimandando alla pagina di login.
A questo punto non ci resta che sostituirlo al filtro Authorize di default, in corrispondenza delle action e dei controller desiderati:
[CustomAuthorize(Users = "Crad")] public ActionResult ReservedAction() { // ... logica qui ... }
Quello presentato è solo una semplice dimostrazione di come si possa personalizzare ASP.NET MVC in fase di authorization ma nulla vieta, ad esempio, di effettuare l'override di AuthorizeCore per intervenire direttamente nella logica di validazione dei permessi per realizzare comportamenti più complessi.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Impostare il forward degli header in un sito ASP.NET Core dietro a un reverse proxy
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Gestire dati sensibili nella configurazione in ASP.NET Core
Chiamare un endpoint ASP.NET Core protetto da Certificate Authentication
Gestire tipi complessi in query string grazie a IParsable in ASP.NET Core 7.0
Sfruttare la local cache del browser tramite gli ETag in ASP.NET Core
Definire le impostazioni di cache a livello di controller in ASP.NET Core 7
Leggere il valore di un header della richiesta in ASP.NET Core 6
Raggruppare i parametri di una minimal API in un singolo oggetto in ASP.NET Core
Taggare la output cache in base al routing in ASP.NET Core
Abilitare automaticamente Dependabot in tutti i repository di una organizzazione su GitHub
Sfruttare l'output cache di ASP.NET Core 7 con i controller
I più letti di oggi
- Sfruttare la local cache del browser tramite gli ETag in #aspnetcore https://aspit.co/cfc di @crad77 #webapi #aspnetmvc #blazor #cache
- Workflow di continuous deployment tramite pull request label in GitHub
- 3 metodi JavaScript che ogni applicazione web dovrebbe contenere
- ASP.NET Website Programming
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!