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
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Load test di ASP.NET Core con k6
Implementare il throttling in ASP.NET Core
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Short-circuiting della Pipeline in ASP.NET Core
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Usare un KeyedService di default in ASP.NET Core 8
Migrare una service connection a workload identity federation in Azure DevOps