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
Filtering sulle colonne in una QuickGrid di Blazor
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Gestione dell'annidamento delle regole dei layer in CSS
Utilizzare QuickGrid di Blazor con Entity Framework
Utilizzare gRPC su App Service di Azure
Usare le collection expression per inizializzare una lista di oggetti in C#
Change tracking e composition in Entity Framework
Utilizzare politiche di resiliency con Azure Container App
Ordinare randomicamente una lista in C#
Utilizzare i primary constructor di C# per inizializzare le proprietà
Usare lo spread operator con i collection initializer in C#
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core