Condividi tramite


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

Si applica a: un cerchio verde con un simbolo di spunta bianco, che indica che il contenuto seguente si applica agli inquilini della forza lavoro. Inquilini della forza lavoro (altre informazioni)

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

  • Un account Azure con una sottoscrizione attiva. Creare un account gratuito. Questo account deve disporre delle autorizzazioni per gestire le applicazioni. Usare uno dei ruoli seguenti necessari per registrare l'applicazione:
    • Amministratore di applicazioni
    • Sviluppatore di applicazioni
  • Registrare una nuova app nell'interfaccia di amministrazione di Microsoft Entra, configurata solo per gli account in questa directory organizzativa. Per altri dettagli, vedere Registrare un'applicazione . Registrare i valori seguenti dalla pagina Panoramica dell'applicazione per usarli in un secondo momento:
    • ID applicazione (cliente)
    • ID della directory (cliente)

Librerie Microsoft che supportano le app Web

Le librerie Microsoft seguenti supportano le app Web:

Linguaggio/quadro di riferimento Progetto su...
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 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
Giava 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
Primavera 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 Nodo MSAL 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
Pitone 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
Pitone identità identità 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.IdentityModelconvalida solo i token. Non può richiedere token ID o di accesso.

Selezionare la scheda della piattaforma desiderata:

Segreti del client o certificati del client

Dato che l'app Web chiama un'API Web downstream, fornisci 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'Scopes in un array, quando si tenta di usare i IDownstreamApi gli scope verranno visualizzati come null e IDownstreamApi tenterà una chiamata anonima (non autenticata) all'API downstream, che genererà un 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 servizio IAuthorizationHeaderProvider che puoi 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 EnableTokenAcquisitionToCallDownstreamApi sono facoltativi e consentono alla tua app Web di richiedere gli ambiti e ottenere il consenso dell'utente per tali ambiti quando effettuano l'accesso. 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 l'SDK di Microsoft Graph nelle azioni API (esposto da GraphServiceClient). 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 ridefinizioni. 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'iniezione delle dipendenze per consentire di decidere l'implementazione della cache dei token nel file Startup.cs della tua 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 dettagli sui provider di cache dei token, vedere anche l'articolo di Microsoft.Identity.Web sulla serializzazione della cache dei token e la fase memorizzazione nella cache dei token delle esercitazioni sull'app Web di ASP.NET Core.

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.