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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Ottenere un token di accesso per una GitHub App
Creare un webhook in Azure DevOps
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Filtering sulle colonne in una QuickGrid di Blazor
Generare un hash con SHA-3 in .NET
Migliorare l'organizzazione delle risorse con Azure Policy
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Creare alias per tipi generici e tuple in C#
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Creare una libreria CSS universale: i bottoni