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 ChatGPT con Azure OpenAI
Monitorare metriche delle risorse Azure con Load Testing
Three-way comparison operator in C++. E in C#?
AWS Lambda Cold Start in C# e...
Caricare un asset come parte di una release con un workflow di GitHub
Usare gateway dedicati con Azure Cosmos DB per migliorare le prestazioni
Chiamare un endpoint ASP.NET Core protetto da Certificate Authentication
Dependency Injection e custom validator in Blazor con .NET 7.0
Autenticazione basata su certificati con ASP.NET Core
Utilizzare la parola chiave nameof per referenziare i nomi dei parametri di un metodo in C#
Definire le impostazioni di cache a livello di controller in ASP.NET Core 7