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
Usare un KeyedService di default in ASP.NET Core 8
Generare file PDF da Blazor WebAssembly con iText
Limitare le richieste lato server con l'interactive routing di Blazor 8
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Migrare una service connection a workload identity federation in Azure DevOps
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Inizializzare i container in Azure Container Apps
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Configurare policy CORS in Azure Container Apps
Criptare la comunicazione con mTLS in Azure Container Apps
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI