Gestire le autorizzazioni a livello di risorsa in ASP.NET MVC

di Marco De Sanctis, in ASP.NET MVC,

Spesso le autorizzazioni delle applicazioni web non possono essere basate solo sul ruolo. Per esempio, in un CMS, vogliamo che solo l'autore di un articolo possa eseguirne la modifica o l'eliminazione. Il modo più naturale per raggiungere questo scopo, in ASP.NET MVC, è quello di realizzare un ActionFilter denominato CheckIsAuthorAttribute con cui decorare action e controller in questo modo:

[HttpGet]
[CheckIsAuthor("id")]
public ActionResult Edit(int id) { ... }

[HttpPost]
[CheckIsAuthor("id")]
public ActionResult Edit(int id, Article article) { ... }

[HttpGet]
[CheckIsAuthor("articleId")]
public ActionResult Delete(int articleId) { ... }

La possibilità di specificare nel costruttore il parametro da utilizzare nella validazione consente una grande flessibilità, perchè ci permette di utilizzare questo filtro senza alcun vincolo di naming.

Il codice da scrivere per realizzare un filtro simile è il seguente:

public class CheckIsAuthorAttribute : AuthorizeAttribute
{
  private string _parameterName;

  public CheckIsAuthorAttribute(string parameterName)
  {
    _parameterName = parameterName;
  }

  public override void OnAuthorization(AuthorizationContext filterContext)
  {
    if (!filterContext.HttpContext.User.IsInRole("Admin"))
    {
      int articleId = (int)filterContext.Controller.ValueProvider
        .GetValue(_parameterName).ConvertTo(typeof(int));

      var article = ArticleRepository.GetArticle(articleId);
      if (article.Author != filterContext.HttpContext.User.Identity.Name)
      {
        this.HandleUnauthorizedRequest(filterContext);
        return;
      }

    }

    base.OnAuthorization(filterContext);
}

CheckIsAuthorAttribute eredita da AuthorizeAttribute ed effettua l'override del metodo OnAuthorization, che contiene tutta la logica di controllo. In particolare, se l'utente appartiene al ruolo Admin l'autorizzazione viene sempre concessa. In caso contrario, tramite il ValueProvider possiamo recuperare il valore del parametro indicato, che sfruttiamo poi per caricare l'articolo e per verificare che l'autore corrisponda all'utente corrente. Se questo controllo fallisce, viene invocato il metodo della classe base HandleUnauthorizedRequest, che si occupa di gestire la mancata autorizzazione restituendo lo status code HTTP opportuno.

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