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
Gestire il colore CSS con HWB
Utilizzare gRPC su App Service di Azure
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Ordinare randomicamente una lista in C#
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Collegare applicazioni server e client con .NET Aspire
Creare un webhook in Azure DevOps
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Creare agenti facilmente con Azure AI Agent Service
Utilizzare DeepSeek R1 con Azure AI
Gestire i dati con Azure Cosmos DB Data Explorer
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- Gestione degli eventi nei Web component HTML
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9