Un'app Web che chiama le API Web: Configurazione del codice

Nell'articolo precedente è stata registrata un'applicazione in Microsoft Entra. Questo articolo illustra come configurare il codice dell'applicazione e modificare l'app Web in modo che non solo consenta agli utenti di accedere, ma anche di chiamare le API Web. L'applicazione creata usa il flusso del codice di autorizzazione OAuth 2.0 per consentire l'accesso dell'utente. Il flusso include due passaggi:

  1. Richiedi un codice di autorizzazione. Questa parte delega un dialogo privato con l'utente a Microsoft Identity Platform. Durante il dialogo, l'utente esegue l'accesso e acconsente all'uso di API Web. Quando il dialogo privato termina correttamente, l'app Web riceve un codice di autorizzazione sull'URI di reindirizzamento.
  2. Richiesta di un token di accesso per l'API tramite il riscatto del codice di autorizzazione.

Prerequisiti

Librerie Microsoft che supportano le app Web

Le librerie Microsoft seguenti supportano le app Web:

Linguaggio/framework Progetto in
GitHub
Pacchetto Recupero
avviata
Consentire l'accesso degli utenti Accedere alle API Web Disponibile a livello generale (GA) o
Anteprima pubblica1
.NET MSAL.NET Microsoft.Identity.Client La libreria non può richiedere token ID per l'accesso utente. La libreria può richiedere token di accesso per le API Web protette. Disponibilità generale
.NET Microsoft.IdentityModel Microsoft.IdentityModel La libreria non può richiedere token ID per l'accesso utente.2 La libreria non può richiedere token di accesso per le API Web protette.2 Disponibilità generale
ASP.NET Core ASP.NET Core Microsoft.AspNetCore.Authentication Guida introduttiva La libreria può richiedere token ID per l'accesso utente. La libreria non può richiedere token di accesso per le API Web protette. Disponibilità generale
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Guida introduttiva La libreria può richiedere token ID per l'accesso utente. La libreria può richiedere token di accesso per le API Web protette. Disponibilità generale
Java MSAL4J msal4j Guida introduttiva La libreria può richiedere token ID per l'accesso utente. La libreria può richiedere token di accesso per le API Web protette. Disponibilità generale
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Esercitazione La libreria può richiedere token ID per l'accesso utente. La libreria può richiedere token di accesso per le API Web protette. Disponibilità generale
Node.js MSAL Node msal-node Guida introduttiva La libreria può richiedere token ID per l'accesso utente. La libreria può richiedere token di accesso per le API Web protette. Disponibilità generale
Python MSAL Python msal La libreria può richiedere token ID per l'accesso utente. La libreria può richiedere token di accesso per le API Web protette. Disponibilità generale
Python identity identity Guida introduttiva La libreria può richiedere token ID per l'accesso utente. La libreria può richiedere token di accesso per le API Web protette. --

(1) Le condizioni di licenza universali per i servizi online si applicano alle librerie in anteprima pubblica.

(2) La libreria Microsoft.IdentityModel convalida solo i token. Non può richiedere token ID o di accesso.

Selezionare la scheda della piattaforma desiderata:

Segreti client o certificati client

Dato che l'app Web chiama ora un'API Web downstream, fornire un segreto client o un certificato client nel file appsettings.json . È anche possibile aggiungere una sezione che specifica:

  • URL dell'API Web downstream
  • Ambiti necessari per chiamare l'API

Nell'esempio seguente la GraphBeta sezione specifica queste impostazioni.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
    {
      "SourceType": "ClientSecret",
      "ClientSecret":"[Enter_the_Client_Secret_Here]"
    }
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
    }
}

Nota

È possibile proporre una raccolta di credenziali client, inclusa una soluzione senza credenziali, ad esempio la federazione delle identità del carico di lavoro per Azure Kubernetes. Le versioni precedenti di Microsoft.Identity.Web hanno espresso il segreto client in una singola proprietà "ClientSecret" anziché "ClientCredentials". Questa opzione è ancora supportata per la compatibilità con le versioni precedenti, ma non è possibile usare sia la proprietà "ClientSecret" che l'insieme "ClientCredentials".

Anziché un segreto client, è possibile fornire un certificato client. Il frammento di codice seguente illustra l'uso di un certificato archiviato in Azure Key Vault.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
  }
}

Avviso

Se si dimentica di modificare l'oggetto Scopes in una matrice, quando si tenta di usare gli IDownstreamApi ambiti verrà visualizzato null e IDownstreamApi si tenterà una chiamata anonima (non autenticata) all'API downstream, che genererà un oggetto 401/unauthenticated.

Microsoft.Identity.Web offre diversi modi per descrivere i certificati, sia per configurazione che per codice. Per informazioni dettagliate, vedere Microsoft.Identity.Web - Uso dei certificati in GitHub.

Modificare il file Startup.cs

L'app Web deve acquisire un token per l'API downstream. È necessario specificarlo aggiungendo la .EnableTokenAcquisitionToCallDownstreamApi() riga dopo .AddMicrosoftIdentityWebApp(Configuration). Questa riga espone il IAuthorizationHeaderProvider servizio che è possibile usare nelle azioni del controller e della pagina. Tuttavia, come si vede nelle due opzioni seguenti, può essere fatto più semplicemente. È anche necessario scegliere un'implementazione della cache dei token, ad esempio .AddInMemoryTokenCaches(), in Startup.cs:

using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

Gli ambiti passati a sono facoltativi e consentono all'app EnableTokenAcquisitionToCallDownstreamApi Web di richiedere gli ambiti e il consenso dell'utente a tali ambiti quando accedono. Se non si specificano gli ambiti, Microsoft.Identity.Web abilita un'esperienza di consenso incrementale.

Microsoft.Identity.Web offre due meccanismi per chiamare un'API Web da un'app Web senza dover acquisire un token. L'opzione scelta dipende dal fatto che si voglia chiamare Microsoft Graph o un'altra API.

Opzione 1: Chiamare Microsoft Graph

Se si vuole chiamare Microsoft Graph, Microsoft.Identity.Web consente di usare direttamente ( GraphServiceClient esposto da Microsoft Graph SDK) nelle azioni api. Per esporre Microsoft Graph:

  1. Aggiungere il pacchetto NuGet Microsoft.Identity.Web.GraphServiceClient al progetto.

  2. Aggiungere .AddMicrosoftGraph() dopo .EnableTokenAcquisitionToCallDownstreamApi() nel file Startup.cs . .AddMicrosoftGraph() ha diverse sostituzioni. Usando l'override che accetta una sezione di configurazione come parametro, il codice diventa:

    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

Opzione 2: Chiamare un'API Web downstream diversa da Microsoft Graph

Se si vuole chiamare un'API diversa da Microsoft Graph, Microsoft.Identity.Web consente di usare l'interfaccia nelle azioni dell'API IDownstreamApi . Per usare questa interfaccia:

  1. Aggiungere il pacchetto NuGet Microsoft.Identity.Web.DownstreamApi al progetto.

  2. Aggiungere .AddDownstreamApi() dopo .EnableTokenAcquisitionToCallDownstreamApi() nel file Startup.cs . .AddDownstreamApi() ha due argomenti ed è illustrato nel frammento di codice seguente:

    • Nome di un servizio (API), usato nelle azioni del controller per fare riferimento alla configurazione corrispondente
    • sezione di configurazione che rappresenta i parametri usati per chiamare l'API Web downstream.
    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddDownstreamApi("MyApi", Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

Riepilogo

Come per le API Web, è possibile scegliere varie implementazioni della cache dei token. Per informazioni dettagliate, vedere Microsoft.Identity.Web - Serializzazione della cache dei token in GitHub.

L'immagine seguente mostra le varie possibilità di Microsoft.Identity.Web e il relativo effetto sul file Startup.cs :

Diagramma a blocchi che mostra le opzioni di configurazione del servizio nel punto di avvio C S per chiamare un'API Web e specificare un'implementazione della cache dei token

Nota

Per comprendere appieno gli esempi di codice, acquisire familiarità con i concetti fondamentali di base di ASP.NET e in particolare con l'inserimento delle dipendenze e le opzioni.

Codice che riscatta il codice di autorizzazione

Microsoft.Identity.Web semplifica il codice specificando le impostazioni corrette di OpenID Connect, sottoscrivendo l'evento di ricezione del codice e riscattando il codice. Non è necessario alcun codice aggiuntivo per riscattare il codice di autorizzazione. Per informazioni dettagliate su come funziona, vedere Codice sorgente Microsoft.Identity.Web.

Anziché un segreto client, l'applicazione client riservata può anche dimostrare la propria identità usando un certificato client o un'asserzione client. L'uso di asserzioni client è uno scenario avanzato descritto in Asserzioni client.

Cache del token

Importante

L'implementazione della cache dei token per le app Web o le API Web è diversa dall'implementazione per le applicazioni desktop che spesso è basata su file. Per motivi di sicurezza e prestazioni, è importante assicurarsi che per le app Web e le API Web esista una cache dei token per ogni account utente. È necessario serializzare la cache dei token per ogni account.

L'esercitazione di ASP.NET Core usa l'inserimento delle dipendenze per consentire di decidere l'implementazione della cache dei token nel file Startup.cs per l'applicazione. Microsoft.Identity.Web viene fornito con serializzatori predefiniti della cache dei token descritti in Serializzazione della cache dei token. Una possibilità interessante è scegliere le cache di memoria distribuita di ASP.NET Core:

// Use a distributed token cache by adding:
    services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(
                initialScopes: new string[] { "user.read" })
            .AddDistributedTokenCaches();

// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();

// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
 options.Configuration = "localhost";
 options.InstanceName = "SampleInstance";
});

// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
 options.ConnectionString = _config["DistCache_ConnectionString"];
 options.SchemaName = "dbo";
 options.TableName = "TestCache";
});

Per informazioni dettagliate sui provider di token cache, vedere anche l'articolo Serializzazione della cache dei token di Microsoft.Identity.Web e le esercitazioni sull'app Web di base di ASP.NET | Fase di memorizzazione nella cache dei token dell'esercitazione sulle app Web.

Passaggio successivo

A questo punto, quando l'utente esegue l'accesso, viene archiviato un token nella cache dei token. Viene ora descritto come viene usato in altre parti dell'app Web.