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
Generare una User Delegation SAS in .NET per Azure Blob Storage
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
La gestione della riconnessione al server di Blazor in .NET 9
Change tracking e composition in Entity Framework
Utilizzare DeepSeek R1 con Azure AI
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Path addizionali per gli asset in ASP.NET Core MVC
Utilizzare Azure AI Studio per testare i modelli AI
Selettore CSS :has() e i suoi casi d'uso avanzati
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione