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
Migrare una service connection a workload identity federation in Azure DevOps
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Usare un KeyedService di default in ASP.NET Core 8
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Registrare servizi multipli tramite chiavi in ASP.NET Core 8