Nel contesto delle applicazioni web basate su ASP.NET Core, il termine pipeline si riferisce alla serie di middleware che processano una richiesta HTTP. Ogni middleware ha la possibilità di passare la richiesta al successivo middleware nella catena o di "interrompere" il flusso, terminando il processo. Quest'ultimo concetto è noto come "short-circuiting".
Immaginiamo per esempio di voler proteggere la nostra API con una API Key, che il client dovrà passare tramite header. Se vogliamo ottimizzare al massimo le prestazioni, potrebbe essere sconveniente creare una custom Authorization come abbiamo visto in uno script in passato (https://www.aspitalia.com/script/1325/Supportare-Autenticazione-Basata-API-Key-ASP.NET-Core.aspx).
Una soluzione, invece, è quella di creare un Middleware che verifichi la chiave, e che nel caso questa verifica fallisca, interrompa la pipeline e risponda immediatamente con un errore:
public class ApiKeyMiddleware { // altro codice qui... public async Task InvokeAsync(HttpContext context) { var apiKey = context.Request.Headers["ApiKey"].FirstOrDefault(); if (string.IsNullOrEmpty(apiKey) || !ApiKeyIsValid(apiKey)) { context.Response.StatusCode = 401; // Non Autorizzato await context.Response.WriteAsync("Chiave API non valida o mancante."); return; // Short-circuiting qui } await _next(context); // passa al prossimo middleware se la chiave API è valida } }
Nell'esempio in alto, abbiamo recuperato il valore della chiave e, in caso la verifica non abbia successo, effettuiamo un return senza invocare il successivo middleware. Questo fa sì che l'intera pipeline di risposta venga interrotta, senza processare ulteriori middleware.
Ovviamente, dovremo registrare il nuovo middleware avendo cura di farlo nella posizione corretta, per esempio subito dopo l'HTTPS redirect:
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // ... services ... var app = builder.Build(); // Configure the HTTP request pipeline. app.UseHttpsRedirection(); app.UseMiddleware<ApiKeyMiddleware>(); // .. altro codice qui .. app.MapControllers(); app.Run(); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Evitare la script injection nelle GitHub Actions
Migrate and Modernize your .NET Applications on Azure
Gestire la cancellazione di una richiesta in streaming da Blazor
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Configurare policy CORS in Azure Container Apps
Eseguire query verso tipi non mappati in Entity Framework Core
.NET Conference Italia 2023
Implementare il throttling in ASP.NET Core
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Copiare automaticamente le secret tra più repository di GitHub
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
I più letti di oggi
- annunciato #netstandard 2.1. .NET Core lo supporterà a partire da #netcore3, così come le prossime versione di #xamarin, #mono e #unity.il supporto per #netfx 4.8, invece, non ci sarà. https://aspit.co/bq2
- Annunciato Silverlight 4 RC e Windows Phone Developer Tools
- Speciale Razor: il nuovo view engine di WebMatrix e ASP.NET MVC
- Speciale Windows Store app: costruire app con WinRT per Windows 8
- Gestire lo stato all'interno di un class component di ReactJS
- Inserimenti bulk su database con la classe SqlBulkCopy di ADO.NET 2.0
- disponibile su MSDN la versione RTM di #VS2013 Update 2! https://aspit.co/auj #msTechEd