API Web protetta: configurazione del codice

Per configurare il codice per l'API Web protetta, comprendere:

  • Cosa definisce le API come protette.
  • Come configurare un token di connessione.
  • Come convalidare il token.

Cosa definisce ASP.NET e api core ASP.NET come protette?

Come le app Web, le API Web di ASP.NET e ASP.NET Core sono protette perché le azioni del controller sono precedute dall'attributo [Authorize]. Le azioni del controller possono essere chiamate solo se l'API viene chiamata con un'identità autorizzata.

Prendere in considerazione le domande seguenti:

  • Solo un'app può chiamare un'API Web. In che modo l'API conosce l'identità dell'app che la chiama?
  • Se l'app chiama l'API per conto di un utente, qual è l'identità dell'utente?

Token di connessione

Il token di connessione impostato nell'intestazione quando l'app viene chiamata contiene informazioni sull'identità dell'app. Contiene anche informazioni sull'utente, a meno che l'app Web non accetti chiamate da servizio a servizio da un'app daemon.

Ecco un esempio di codice C# che mostra un client che chiama l'API dopo aver acquisito un token con Microsoft Authentication Library per .NET (MSAL.NET):

var scopes = new[] {$"api://.../access_as_user"};
var result = await app.AcquireToken(scopes)
                      .ExecuteAsync();

httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);

Importante

Un'applicazione client richiede il token di connessione a Microsoft Identity Platform per l'API Web. L'API è l'unica applicazione che deve verificare il token e visualizzare le attestazioni contenute. Le app client non devono mai provare a esaminare le attestazioni nei token.

In futuro, l'API Web potrebbe richiedere che il token sia crittografato. Questo requisito impedisce l'accesso alle app client in grado di visualizzare i token di accesso.

Configurazione di JwtBearer

Questa sezione descrive come configurare un token di connessione.

File di configurazione

È necessario specificare l'elemento TenantId solo se si desidera accettare token di accesso da un singolo tenant (app line-of-business). In caso contrario, può essere lasciato come common. I diversi valori possono essere:

  • GUID (ID tenant = ID directory)
  • common può essere qualsiasi organizzazione e account personale
  • organizations può essere qualsiasi organizzazione
  • consumers sono account personali Microsoft
{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "Enter_the_Application_(client)_ID_here",
    "TenantId": "common"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Uso di un URI ID app personalizzato per un'API Web

Se è stato accettato l'URI ID app predefinito proposto dal portale di Azure, non è necessario specificare il gruppo di destinatari (vedere URI id applicazione e ambiti). In caso contrario, aggiungere una Audience proprietà il cui valore è l'URI ID app per l'API Web. Questo inizia in genere con api://.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "Enter_the_Application_(client)_ID_here",
    "TenantId": "common",
    "Audience": "Enter_the_Application_ID_URI_here"
  },
}

Inizializzazione del codice

Quando un'app viene chiamata su un'azione controller che contiene un attributo [Authorize] , ASP.NET e ASP.NET Core estraggono il token di accesso dal token di connessione dell'intestazione di autorizzazione. Il token di accesso viene quindi inoltrato al middleware JwtBearer, che chiama le estensioni Microsoft IdentityModel per .NET.

Microsoft.Identity.Web

Microsoft consiglia di usare il pacchetto NuGet Microsoft.Identity.Web durante lo sviluppo di un'API Web con ASP.NET Core.

Microsoft.Identity.Web fornisce l'associazione tra ASP.NET Core, il middleware di autenticazione e Microsoft Authentication Library (MSAL) per .NET. Consente un'esperienza di sviluppo più chiara e affidabile e sfrutta la potenza di Microsoft Identity Platform e Azure AD B2C.

ASP.NET per .NET 6.0

Per creare un nuovo progetto API Web che usa Microsoft.Identity.Web, usare un modello di progetto nell'interfaccia della riga di comando di .NET 6.0 o in Visual Studio.

Interfaccia della riga di comando di Dotnet Core

# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg

Visual Studio: per creare un progetto API Web in Visual Studio, selezionare File>nuovo>progetto>ASP.NET API Web principale.

Sia l'interfaccia della riga di comando di .NET che i modelli di progetto di Visual Studio creano un file Program.cs simile a questo frammento di codice. Si noti Microsoft.Identity.Web l'uso della direttiva e delle righe contenenti l'autenticazione e l'autorizzazione.

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();