Personalizzare il comportamento di ASP.NET MVC in fase di autorizzazione

di Marco De Sanctis, in ASP.NET MVC, C#,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi