Condividi tramite


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 le API di ASP.NET e ASP.NET Core 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 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

In questa sezione viene descritto come configurare un token di connessione.

File di configurazione

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

  • Un GUID (ID tenant = ID directory)
  • common può essere qualsiasi organizzazione e account personale
  • organizations può essere qualsiasi organizzazione
  • consumers sono gli account Microsoft personali
{
  "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 proprietà Audience il cui valore è l'URI ID app per l'API Web. In genere inizia 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

# 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 Core.

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 come Microsoft.Identity.Web utilizza la direttiva e le 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();