API Web che chiama le API Web: Configurazione del codice

Questo articolo descrive come configurare il codice per un'app per le API Web usando il flusso del codice di autorizzazione OAuth 2.0.

Microsoft consiglia di usare il pacchetto NuGet Microsoft.Identity.Web durante lo sviluppo di un'API protetta ASP.NET Core che chiama le API Web downstream. Vedere API Web protetta: Configurazione del codice | Microsoft.Identity.Web per una rapida presentazione di tale libreria nel contesto di un'API Web.

Prerequisiti

Configurare l'app

Scegliere una lingua per l'API Web.

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.

Program.cs

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Un'API Web deve acquisire un token per l'API downstream. Specificarlo aggiungendo la .EnableTokenAcquisitionToCallDownstreamApi() riga dopo .AddMicrosoftIdentityWebApi(Configuration). Questa riga espone il ITokenAcquisition servizio che può essere usato nelle azioni controller/pagine.

Tuttavia, un metodo alternativo consiste nell'implementare una cache dei token. Ad esempio, l'aggiunta .AddInMemoryTokenCaches()di , a Program.cs consente di memorizzare nella cache il token in memoria.

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

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

Opzione 1: Chiamare Microsoft Graph

Per chiamare Microsoft Graph, Microsoft.Identity.Web consente di usare direttamente ( GraphServiceClient esposto da Microsoft Graph SDK) nelle azioni dell'API.

Nota

Esiste un problema in corso per Microsoft Graph SDK v5+. Per altre informazioni, vedere il problema di GitHub.

Per esporre Microsoft Graph:

  1. Aggiungere il pacchetto NuGet Microsoft.Identity.Web.GraphServiceClient al progetto.
  2. Aggiungere .AddMicrosoftGraph() dopo .EnableTokenAcquisitionToCallDownstreamApi() in Program.cs. .AddMicrosoftGraph() ha diverse sostituzioni. Usando l'override che accetta una sezione di configurazione come parametro, il codice diventa:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
    .AddInMemoryTokenCaches();
// ...

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

  1. Aggiungere il pacchetto NuGet Microsoft.Identity.Web.DownstreamApi al progetto.
  2. Aggiungere .AddDownstreamApi() dopo .EnableTokenAcquisitionToCallDownstreamApi() in Program.cs. Il codice diventa:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddInMemoryTokenCaches();
// ...

dove;

  • MyApi indica il nome dell'API Web downstream che l'API Web intende chiamare
  • MyApiScope è l'ambito necessario per richiedere l'API Web per interagire con l'API Web downstream

Questi valori verranno rappresentati nel codice JSON che sarà simile al frammento di codice seguente.

"DownstreamAPI": {
      "BaseUrl": "https://downstreamapi.contoso.com/",
      "Scopes": "user.read"
    },

Se l'app Web deve chiamare un'altra risorsa API, ripetere il .AddDownstreamApi() metodo con l'ambito pertinente, come illustrato nel frammento di codice seguente:

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
    .AddInMemoryTokenCaches();
// ...

Si noti che .EnableTokenAcquisitionToCallDownstreamApi viene chiamato senza alcun parametro, il che significa che il token di accesso viene acquisito just-in-time quando il controller richiede il token specificando l'ambito.

L'ambito può anche essere passato quando si chiama .EnableTokenAcquisitionToCallDownstreamApi, che renderebbe l'app Web acquisire il token durante l'accesso utente iniziale stesso. Il token verrà quindi estratto dalla cache quando il controller lo richiede.

Analogamente alle app 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 possibilità di Microsoft.Identity.Web e l'impatto sulle Program.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.

È anche possibile vedere un esempio di implementazione del flusso OBO in Node.js e Funzioni di Azure.

Protocollo

Per altre informazioni sul protocollo OBO, vedere il flusso Microsoft Identity Platform e OAuth 2.0 On-Behalf-Of.

Passaggio successivo