Nello script precedente ci siamo occupati di HealthCheck (https://www.aspitalia.com/script/1316/Verificare-Funzionamento-Applicazione-ASP.NET-Core-2.2.aspx), una delle nuove funzionalità introdotte da ASP.NET Core 2.2 che permette di monitorare lo stato di salute di un'applicazione e delle sue dipendenze.
Il principio di funzionamento è incentrato sull'utilizzo di un middleware che si occupa di generare la risposta in base ai check che abbiamo configurato tra i servizi. Questi ultimi possono includere risorse particolarmente delicate, quali database, per esempio, che potrebbero essere facilmente sovraccaricati da un attacco DDoS sull'endpoint di HealthCheck. Pertanto, in alcuni scenari, può essere consigliabile proteggere questo endpoint tramite autenticazione.
ASP.NET Core 2.2 non espone questa funzionalità direttamente, ma è abbastanza semplice implementarla se si ha un po' di dimistichezza con i middleware.
Immaginiamo, per esempio, di avere già un progetto Web API che registra qualche tipo di security, quale Azure Active Directory, Cookie o quant'altro. Pertanto, all'interno della classe Startup, avremo già una chiamata al metodo UseAuthentication come nel codice in basso:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // .. altro codice qui .. app.UseAuthentication(); // .. altro codice qui .. }
Questo metodo registra un middleware che valuta il contenuto della richiesta e, nel caso contenga dati validi di autenticazione (per es. un Bearer Token tra gli header), istanzia un ClaimsPrincipal nell'HttpContext corrente.
Se vogliamo proteggere l'endpoint di HealthCheck, allora, possiamo registrare un nostro custom middleware, che agisca prima di quello di HealthCheck e che termini la richiesta nel caso il ClaimsPrincipal non sia valido.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // .. altro codice qui .. app.UseAuthentication(); app.Map("/health", a => { a.Use(async (context, next) => { if (context.User.Identity.IsAuthenticated) { await next.Invoke(); return; } context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; }); a.UseMiddleware<HealthCheckMiddleware>(); }); // .. altro codice qui .. }
Nel codice in alto, abbiamo mappato l'endpoint /health su una sequenza di due middleware:
- Il primo, definito tramite una lambda expression, verifica se l'utente del context corrente sia autenticato e, solo in caso affermativo, passa la chiamata al middleware successivo. In caso contrario, invece, ritorna uno status code 401 - Unauthorized.
- Il secondo è il vero e proprio HealthCheckMiddleware, che implementa la logica di HealthCheck.
Il pregio di questa tecnica è che sfrutta il principio di funzionamento del middleware di autenticazione, ed è pertanto completamente agnostica all'effettivo tipo di autenticazione utilizzata - sia esso OAuth2, Cookies, etc.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
.NET Conference Italia 2024
Load test di ASP.NET Core con k6
Ordinare randomicamente una lista in C#
Utilizzare QuickGrid di Blazor con Entity Framework
Miglioramenti agli screen reader e al contrasto in Angular
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Gestire i dati con Azure Cosmos DB Data Explorer
Assegnare un valore di default a un parametro di una lambda in C#
Ottenere un token di accesso per una GitHub App
I più letti di oggi
- anche domani dalle 17:30 seguite con noi live #build15 https://aspit.co/build15
- Webcast 'AJAX & ATLAS Overview'
- a #igds il 25 e 26/10 a Milano puoi sviluppare un gioco per #wp8 con @AppCampus. in palio 70.000 Euro: https://aspit.co/apa
- WinJS in Windows Phone 8.1
- la RC di #vs13 è compatibile con #win81 RTM, non con la Preview. l'annuncio ufficiale è su https://aspit.co/any
- Ancora un bug: esce Mono 0.23
- SSL Certificates for everyone on Azure
- Mostrare una MessageBox con un custom control
- disponibile la preview 1 ci #dotnetcore 2.1, #aspnetcore, #efcore. performance, novità e migliorie su https://aspit.co/bmf
- si continua a #netconfit con 'developing modern web apps with #aspnetcore', con il nostro @dbochicchiohttps://aspit.co/netconf-18