Negli ultimi script abbiamo introdotto Minimal API (https://www.aspitalia.com/script/1413/Creare-Velocemente-Microservice-Minimal-API-ASP.NET-Core.aspx), una nuova funzionalità di ASP.NET Core 6 che permette di scrivere microservice con pochissimo codice, unitamente al loro supporto per la dependency injection (https://www.aspitalia.com/script/1414/Dependency-Injection-Minimal-API-ASP.NET-Core.aspx).
Ovviamente, anche dal lato security, questo nuovo metodo di realizzare servizi offre funzionalità analoghe a quelle che abbiamo utilizzato per anni tramite controller.
Innanzi tutto dobbiamo assicurarci di aver referenziato il package Microsoft.AspNetCore.Authentication.JwtBearer nel nostro progetto:
<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.3" /> </ItemGroup>
A questo punto, come nel caso di un'applicazione ASP.NET Core tradizionale, il primo passo è quello di configurare i servizi di authentication e authorization all'interno di Program.cs, con i relativi middleware:
using Microsoft.AspNetCore.Authentication.JwtBearer; var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = string.Format("https://login.microsoftonline.com/{0}", builder.Configuration["AzureAD:TenantId"]); options.Audience = builder.Configuration["AzureAD:Audience"]; options.TokenValidationParameters.ValidateIssuer = true; }); builder.Services.AddAuthorization(); var app = builder.Build(); // Configure the HTTP request pipeline. app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization();
Nel nostro caso, stiamo sfruttando un'autenticazione basata su Azure Active Directory, di cui stiamo leggiamo le varie impostazioni tramite il dictionary builder.Configuration. A meno di non dover definire policy particolari, poi, ci è sufficiente aggiungere i servizi di autorizzazione tramite AddAuthorization.
{ ... "AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "ef3d3c56-....", "Audience": "api://mydemoapi" } }
Successivamente, come accennato, dobbiamo configurare anche i middleware con UseAuthentication e UseAuthorization, che vanno registrati nell'ordine corretto - autenticazione prima, e successivamente autorizzazione - altrimenti l'applicazione non sarà in grado di funzionare.
Ora possiamo finalmente passare ai nostri endpoint, la cui definizione è assolutamente analoga a quanto visto in precedenza, a parte l'utilizzo dell'extension method RequireAuthorization, che è un po' l'analogo dell'attributo Authorize dei controller.
app.MapGet("/weatherforecast", () => { ... return forecast; }).RequireAuthorization();
Come possiamo aspettarci, in questa forma l'unico requisito è che l'utente sia autenticato, ma esiste anche un overload di questo metodo tramite cui specificare policy più restrittive, quali l'appartenenza a un determinato ruolo o la presenza di claim specifici all'interno del JWT token fornito nella richiesta.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Applicare un filtro per recuperare alcune issue di GitHub
Utilizzare una qualunque lista per i parametri di tipo params in C#
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Supportare la sessione affinity di Azure App Service con Application Gateway
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Escludere alcuni file da GitHub Secret Scanning
Gestire la cancellazione di una richiesta in streaming da Blazor
Gestire il colore CSS con HWB
Gestione CSS in Blazor con .NET 9
Utilizzare Locust con Azure Load Testing