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
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Migrare una service connection a workload identity federation in Azure DevOps
Limitare le richieste lato server con l'interactive routing di Blazor 8
Disabilitare automaticamente un workflow di GitHub
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Generare token per autenicarsi sulle API di GitHub
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Gestire undefined e partial nelle reactive forms di Angular
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Eseguire attività con Azure Container Jobs