Esercitazione: Creare e proteggere un'API Web ASP.NET Core con Microsoft Identity Platform
si applica a: tenant forza lavoro
tenant esterni (ulteriori informazioni)
Questa serie di esercitazioni illustra come proteggere un'API Web ASP.NET Core con Microsoft Identity Platform per limitare l'accesso solo agli utenti autorizzati e alle app client. L'API Web compilata usa autorizzazioni delegate (ambiti) e autorizzazioni dell'applicazione (ruoli dell'app).
In questa esercitazione si apprenderà come:
- Creare un'API Web ASP.NET Core
- Configurare l'API Web per utilizzare i dettagli di registrazione dell'app di Microsoft Entra
- Proteggere gli endpoint dell'API Web
- Eseguire l'API Web per assicurarsi che sia in ascolto delle richieste HTTP
Prerequisiti
- Se non è già stato fatto, completare i passaggi descritti in Avvio rapido: Effettuare l'accesso per gli utenti in una app Web di esempio. Nella *quickstart* non è necessario clonare ed eseguire il campione di codice.
- .NET 8.0 SDK o versione successiva.
- Visual Studio Code o un altro editor di codice.
Creare un nuovo progetto API Web di ASP.NET Core
Per creare un progetto API Web core ASP.NET minimo, seguire questa procedura:
Aprire il terminale in Visual Studio Code o in qualsiasi altro editor di codice e passare alla directory in cui si vuole creare il progetto.
Eseguire i comandi seguenti nell'interfaccia della riga di comando di .NET o in qualsiasi altro strumento da riga di comando.
dotnet new webapi -n MyProtectedApi cd MyProtectedApi
Selezionare Sì quando una finestra di dialogo chiede se si vuole considerare attendibili gli autori.
Selezionare Sì Quando una finestra di dialogo chiede se si desidera aggiungere gli asset necessari al progetto.
Installare i pacchetti necessari
Per proteggere un'API Web ASP.NET Core, è necessario il pacchetto Microsoft.Identity.Web
, ovvero un set di librerie di base di ASP.NET che semplificano l'aggiunta del supporto dell'autenticazione e dell'autorizzazione alle app Web e alle API Web che si integrano con Microsoft Identity Platform.
Per installare il pacchetto, usare:
dotnet add package Microsoft.Identity.Web
Configurare i dettagli di registrazione dell'app
Aprire il file appsettings.json nella cartella dell'app e aggiungere i dettagli di registrazione dell'app registrati dopo la registrazione dell'API Web.
{
"AzureAd": {
"Instance": "Enter_the_Authority_URL_Here",
"TenantId": "Enter_the_Tenant_Id_Here",
"ClientId": "Enter_the_Application_Id_Here",
},
"Logging": {...},
"AllowedHosts": "*"
}
Sostituire i segnaposto seguenti come illustrato:
- Sostituire
Enter_the_Application_Id_Here
con l'ID applicazione (client). - Sostituire
Enter_the_Tenant_Id_Here
con l'ID della directory (tenant). - Sostituire
Enter_the_Authority_URL_Here
con l'URL dell'autorità, come illustrato nella sezione successiva.
URL dell'autorità per l'app
L'URL dell'autorità specifica la directory da cui Microsoft Authentication Library (MSAL) può richiedere token. È costruito in modo diverso sia nella manodopera che negli inquilini esterni, come illustrato di seguito:
- tenant di Workforce
- tenant esterno
//Instance for workforce tenant
Instance: "https://login.microsoftonline.com/"
Usare un dominio URL personalizzato (facoltativo)
- tenant di Workforce
- tenant esterno
I domini URL personalizzati non sono supportati nelle utenze aziendali.
Aggiungere un ruolo e un ambito dell'app
Tutte le API devono pubblicare almeno un ambito, detto anche autorizzazione delegata, affinché le app client ottengano correttamente un token di accesso per un utente. Le API devono anche pubblicare almeno un ruolo dell'applicazione, detto anche autorizzazioni dell'applicazione, affinché le app client ottengano un token di accesso in qualità di sé stesse, ovvero quando non effettuano l'accesso come utente.
Queste autorizzazioni vengono specificate nel file appsettings.json. In questa esercitazione, registrerai sia i permessi delegati che i permessi dell'applicazione con gli scopi "Forecast.Read". Ciò significa che solo gli utenti o le applicazioni client che chiamano l'API con un token di accesso contenente l'ambito "Forecast.Read" ottengono l'autorizzazione per accedere all'endpoint protetto.
{
"AzureAd": {
"Instance": "Enter_the_Authority_URL_Here",
"TenantId": "Enter_the_Tenant_Id_Here",
"ClientId": "Enter_the_Application_Id_Here",
"Scopes": {
"Read": "Forecast.Read",
},
"AppPermissions": {
"Read": ["Forecast.Read"],
}
},
"Logging": {...},
"AllowedHosts": "*"
}
Implementare l'autenticazione e l'autorizzazione nell'API
Per configurare l'autenticazione e l'autorizzazione, aprire il file program.cs
e sostituirne il contenuto nei frammenti di codice seguenti:
Aggiungere uno schema di autenticazione
In questa API viene usato lo schema di connessione JWT (JSON Web Token) come meccanismo di autenticazione predefinito. Usare il metodo AddAuthentication
per registrare lo schema bearer JWT.
// Import the required packages
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
// Configure authentication
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
builder.Configuration.Bind("AzureAd", options);
options.TokenValidationParameters.NameClaimType = "name";
}, options => { builder.Configuration.Bind("AzureAd", options); });
Configurare l'autorizzazione
L'autorizzazione determina le operazioni consentite a un utente autenticato. Definiamo un criterio denominato AuthZPolicy
che richiede al client di chiamare l'API per avere il ruolo di Forecast.Read
per le app client o l'ambito Forecast.Read
per un utente connesso.
builder.Services.AddAuthorization(config =>
{
config.AddPolicy("AuthZPolicy", policy =>
policy.RequireRole("Forecast.Read"));
});
Il metodo AddPolicy
crea un criterio denominato (AuthZPolicy
) che verifica la presenza del ruolo Forecast.Read
nelle attestazioni del token dell'utente. Se il token non dispone dell'attestazione roles
, l'accesso agli endpoint che richiedono questo criterio viene negato.
Compilare la pipeline di richiesta HTTP
In questa esercitazione viene usata un'API minima senza controller perché l'attenzione è maggiore sulla protezione dell'API. Per configurare la pipeline middleware dell'API, aggiungere quanto segue:
- reindirizzamento HTTPS: applicare la comunicazione sicura reindirizzando le richieste HTTP a HTTPS.
- middleware di autenticazione: convalida i token in ingresso prima dell'elaborazione delle richieste.
- middleware di autorizzazione: applica i criteri dopo l'autenticazione, assicurando che solo i client autorizzati possano accedere agli endpoint protetti.
var app = builder.Build();
// Configure the HTTP request pipeline
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
Definire l'endpoint delle previsioni meteo
L'endpoint /weatherforecast
genera una previsione casuale di cinque giorni, protetta dai criteri di autorizzazione.
RequireAuthorization("AuthZPolicy")
garantisce che solo i client con il ruolo Forecast.Read
possano accedervi.
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
})
.WithName("weatherForecast")
.RequireAuthorization("AuthZPolicy"); // Protect this endpoint with the AuthZPolicy
app.Run();
record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
Il flusso di autenticazione e autorizzazione nell'API Web di esempio creata funziona come segue:
- Il client invia una richiesta GET a
/weatherforecast
con un token JWT nell'intestazioneAuthorization
. -
UseAuthentication
convalida il token rispetto all'ID Microsoft Entra -
UseAuthorization
verifica la presenza del ruoloForecast.Read
nelle attestazioni del token. - In caso di esito positivo, l'endpoint restituisce la previsione; in caso contrario, risponde con
401 Unauthorized
(token non valido/nessun token) o403 Forbidden
(ruolo mancante).
Esegui l'API
Eseguire l'API per assicurarsi che sia in esecuzione senza errori usando il comando dotnet run
. Se si intende usare il protocollo HTTPS anche durante i test, è necessario considerare attendibile . Il certificato di sviluppo di NET.
Avviare l'applicazione digitando quanto segue nel terminale:
dotnet run
Nel terminale dovrebbe essere visualizzato un output simile al seguente, che conferma che l'applicazione è in esecuzione in
http://localhost:{port}
e in ascolto delle richieste.Building... info: Microsoft.Hosting.Lifetime[0] Now listening on: http://localhost:{port} info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. ...
La pagina Web http://localhost:{host}
visualizza un output simile all'immagine seguente. Ciò è dovuto al fatto che l'API viene chiamata senza autenticazione. Per effettuare una chiamata autorizzata, vedere Passaggi successivi per istruzioni su come accedere a un'API Web protetta.
Per un esempio completo di questo codice API, vedere il file di esempi di.