Quando si pubblicano API su web, una delle necessità più comuni è quella di evitare che chiunque possa accedervi indiscriminatamente. Un tipico esempio è quello di un servizio di backend, a supporto di una nostra applicazione mobile: in un simile scenario, vogliamo fare in modo che solo quest'ultima possa invocare i metodi esposti.
Esistono diverse tecniche per raggiungere questo risultato, ma la più comune e facilmente realizzabile è quella di aggiungere delle credenziali (per esempio user e password, o una API-Key) all'header della richiesta, così che questa possa essere validata.
Sebbene anche in ASP.NET Web API sia presente l'infrastruttura dei filter tipica di ASP.NET MVC, il sistema più corretto per effettuare questo tipo di controllo è realizzare un message handler, ossia un oggetto che viene inserito nella pipeline di elaborazione della richiesta ed eseguito a ogni chiamata. Si tratta di una classe che eredita da DelegatingHandler e che effettua l'override del metodo SendAsync:
internal class ApiKeyHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { if (!this.ValidateKey(request)) { var response = new HttpResponseMessage(HttpStatusCode.Forbidden); var tsc = new TaskCompletionSource<HttpResponseMessage>(); tsc.SetResult(response); return tsc.Task; } return base.SendAsync(request, cancellationToken); } }
Nell'esempio in alto, a ogni richiesta eseguiamo il metodo ValidateKey, all'interno del quale abbiamo implementato la nostra logica di autorizzazione; se il controllo fallisce, l'elaborazione della pipeline viene interrotta e viene restituito un HTTP Status Code 403, altrimenti proseguiamo con il flusso originale. Un esempio molto banale di ValidateKey può essere il seguente, in cui controlliamo la presenza di un opportuno header nella richiesta.
private const string HEADER_NAME = "MyApiKey"; private bool ValidateKey(HttpRequestMessage message) { if (!message.Headers.Contains(HEADER_NAME)) return false; string key = message.Headers.GetValues(HEADER_NAME).FirstOrDefault(); return (key == "Chiave segretissima"); }
Una volta realizzato l'handler, non dobbiamo fare altro che registrarlo nel runtime di ASP.NET Web API, inserendo questo codice nell'Application_Start del global.asax:
GlobalConfiguration.Configuration .MessageHandlers.Add(new ApiKeyHandler());
Ovviamente si tratta di un sistema di sicurezza che, nella sua accezione più banale, è efficace solo se stiamo usando SSL, e quindi il protocollo HTTPS, altrimenti chiunque può leggere le credenziali usate e replicarle. La soluzione che abbiamo proposto, tuttavia, si presta anche a implementazioni più complesse, come la validazione di una eventuale firma digitale della richiesta.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Utilizzare DeepSeek R1 con Azure AI
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Migrare una service connection a workload identity federation in Azure DevOps
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Creare una libreria CSS universale: Clip-path
Scrivere selettori CSS più semplici ed efficienti con :is()
Utilizzare Azure Cosmos DB con i vettori
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Utilizzare Container Queries nominali
Miglioramenti nell'accessibilità con Angular CDK
I più letti di oggi
- Implementare l'infinite scroll con QuickGrid in Blazor Server
- #vs2017 sarà rilasciato il 07/03, in concomitanza con i suoi 20 anni https://aspit.co/bfn
- Ondata di novità per Windows Azure
- Novità per Win CE: .NET compact framework e SQL Server CE 2.0
- Presentata la nuova versione di C#
- Microsoft Security Bulletin MS05-013
- Rilasciato SQL Server 2005 in italiano
- Per la settimana prossima la beta1 del primo Service Pack di VS 2005
- SSL Certificates for everyone on Azure
- Repository con code-first di Entity Framework