Autenticazione con Minimal API di ASP.NET Core 6

di Marco De Sanctis, in ASP.NET Core,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi