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
Utilizzare parametri a livello di controller nel routing di ASP.NET Core
Migrare un repository che contiene large file storage objects in GitHub
Gestire il fallimento di uno step in un workflow di GitHub
Gestire i file esterni in una PWA
Utilizzare Front Door come CDN di contenuti statici
Leggere la configurazione da Azure KeyVault con logica di retry in ASP.NET Core
Aggiungere le issue di più repository in una board in GitHub
Taggare automaticamente un repository con un workflow di GitHub
YARP: un reverse proxy in ASP.NET Core
Leggere il valore di un header della richiesta in ASP.NET Core 6
Three-way comparison operator in C++. E in C#?
Eseguire chiamate hedging gRPC con ASP.NET Core 6
I più letti di oggi
- Linting di un Dockerfile con un workflow di GitHub
- Sfruttare la local cache del browser tramite gli ETag in #aspnetcore https://aspit.co/cfc di @crad77 #webapi #aspnetmvc #blazor #cache
- 3 metodi JavaScript che ogni applicazione web dovrebbe contenere - Parte 2
- Monitorare i server on-premises con Azure Arc