API web que llama a API web: Configuración del código

Una vez completado el registro de una API web, se puede configurar el código de la aplicación. La configuración de una API web para llamar a una API web de nivel inferior se basa en el código que se usa para proteger una API web. Para más información, consulte API web protegida: configuración de la aplicación.

Microsoft.Identity.Web

Microsoft recomienda usar el paquete NuGet Microsoft.Identity.Web al desarrollar API web de nivel inferior de llamada API protegidas por ASP.NET Core. Consulte API web protegida: Configuración de código | Microsoft.Identity.Web para ver una presentación rápida de la biblioteca en el contexto de una API web.

Secretos de cliente o certificados de cliente

Dado que la aplicación web ahora llama a una API web de nivel inferior, proporcione un secreto de cliente o un certificado de cliente en el archivo appsettings.json. También puede agregar una sección que especifique:

  • La dirección URL de la API web de nivel inferior.
  • Los ámbitos necesarios para llamar a la API.

En el ejemplo siguiente, la sección GraphBeta especifica esta configuración.

{
  "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

Puede proponer una colección de credenciales de cliente, incluida una solución sin credenciales, como la federación de identidades de carga de trabajo para Azure Kubernetes. Las versiones anteriores de Microsoft.Identity.Web expresaron el secreto de cliente en una sola propiedad "ClientSecret" en lugar de "ClientCredentials". Esto sigue siendo compatible con versiones anteriores, pero no puede usar la propiedad "ClientSecret" y la colección "ClientCredentials".

En lugar de un secreto de cliente, puede proporcionar un certificado de cliente. En el fragmento de código siguiente se muestra el uso de un certificado almacenado en 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"]
  }
}

Advertencia

Si olvida cambiar Scopes a una matriz, cuando intente usar IDownstreamApi los ámbitos aparecerán como nulos, y IDownstreamApi intentará una llamada anónima (sin autenticar) a la API descendente, lo cual resultará en un 401/unauthenticated.

Microsoft.Identity.Web proporciona varias maneras de describir certificados, tanto mediante configuración como mediante código. Para más información, consulte Microsoft.Identity.Web: uso de certificados en GitHub.

Program.cs

using Microsoft.Identity.Web;

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

Una aplicación web tiene que adquirir un token para la API de nivel inferior. Para especificarlo, agregue la línea .EnableTokenAcquisitionToCallDownstreamApi() después de .AddMicrosoftIdentityWebApi(Configuration). Esta línea expone el servicio ITokenAcquisition, que se puede usar en las acciones de controlador o páginas.

Sin embargo, un método alternativo es implementar una caché de tokens. Por ejemplo, agregar .AddInMemoryTokenCaches() a Program.cs permite que el token se almacene en caché en memoria.

using Microsoft.Identity.Web;

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

Microsoft.Identity.Web proporciona dos mecanismos para llamar a una API web de nivel inferior desde otra API. La opción que elija dependerá de si desea llamar a Microsoft Graph o a otra API.

Opción 1: Llamada a Microsoft Graph

Para llamar a Microsoft Graph, Microsoft.Identity.Web le permite usar directamente GraphServiceClient (expuesto por el SDK de Microsoft Graph) en las acciones de la API.

Nota

Hay un problema en curso para el SDK de Microsoft Graph v5+. Para más información, consulte el problema de GitHub.

Para exponer Microsoft Graph:

  1. Agregue el paquete NuGet Microsoft.Identity.Web.GraphServiceClient al proyecto.
  2. Agregue .AddMicrosoftGraph() después de .EnableTokenAcquisitionToCallDownstreamApi() en Program.cs. .AddMicrosoftGraph() tiene varias invalidaciones. Cuando se utiliza la invalidación que toma una sección de la configuración como parámetro, el código se convierte en:
using Microsoft.Identity.Web;

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

Opción 2: Llamada a una API web de nivel inferior que no sea Microsoft Graph

  1. Agregue el paquete NuGet Microsoft.Identity.Web.DownstreamApi al proyecto.
  2. Agregue .AddDownstreamApi() después de .EnableTokenAcquisitionToCallDownstreamApi() en Program.cs. El código se convierte en:
using Microsoft.Identity.Web;

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

donde:

  • MyApi indica el nombre de la API web de bajada a la que pretende llamar la API web.
  • MyApiScope es el ámbito necesario para que la API web solicite para interactuar con la API web de bajada.

Estos valores se representarán en el JSON que será similar al fragmento de código siguiente.

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

Si la aplicación web necesita llamar a otro recurso de API, repita el método de la .AddDownstreamApi() con el ámbito pertinente, como se muestra en el siguiente fragmento de código:

using Microsoft.Identity.Web;

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

Tenga en cuenta que .EnableTokenAcquisitionToCallDownstreamApi se llama sin ningún parámetro, lo que significa que el token de acceso se adquirirá justo a tiempo, ya que el controlador solicita el token especificando el ámbito.

El ámbito también se puede pasar al llamar a la .EnableTokenAcquisitionToCallDownstreamApi, lo que haría que la aplicación web adquiriera el token durante el inicio de sesión del usuario. A continuación, el token se extraerá de la memoria caché cuando el controlador lo solicite.

De forma similar a las aplicaciones web, se pueden elegir varias implementaciones de caché de tokens. Para obtener más información, consulte Microsoft.Identity.Web: Serialización de la caché de tokens en GitHub.

En la imagen siguiente se muestran las posibilidades de Microsoft.Identity.Web y su impacto en Program.cs:

Block diagram showing service configuration options in startup dot C S for calling a web API and specifying a token cache implementation

Nota:

Para comprender por completo los ejemplos de código que se indican a continuación, familiarícese con los aspectos básicos de ASP.NET Core y, en particular, con la inserción de dependencias y las opciones.

También puede ver un ejemplo de implementación del flujo con derechos delegados en Node.js y Azure Functions.

Protocolo

Para más información acerca del protocolo OBO, consulte Flujo con derechos delegados de OAuth 2.0 y Plataforma de identidad de Microsoft.

Pasos siguientes

Avance al siguiente artículo de este escenario, Obtención de un token para la aplicación.