Share via


Uma API da Web que chama APIs da Web: Configuração de código

Quando o registro para uma API Web estiver concluído, o código do aplicativo poderá ser configurado. A configuração de uma API da Web para chamar uma API da Web downstream baseia-se no código usado na proteção de uma API da Web. Para obter mais informações, consulte API da Web protegida: configuração do aplicativo.

Microsoft.Identity.Web

A Microsoft recomenda que você use o pacote NuGet Microsoft.Identity.Web ao desenvolver uma API protegida do ASP.NET Core chamando APIs da Web downstream. Consulte API da Web protegida: Configuração de código | Microsoft.Identity.Web para uma apresentação rápida dessa biblioteca no contexto de uma API da Web.

Segredos do cliente ou certificados do cliente

Como seu aplicativo Web agora chama uma API da Web downstream, forneça um segredo do cliente ou um certificado de cliente no arquivo appsettings.json . Você também pode adicionar uma seção que especifique:

  • O URL da API Web downstream
  • Os escopos necessários para chamar a API

No exemplo a seguir, a GraphBeta seção especifica essas configurações.

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

Você pode propor uma coleção de credenciais de cliente, incluindo uma solução sem credenciais, como federação de identidade de carga de trabalho para Kubernetes do Azure. Versões anteriores do Microsoft.Identity.Web expressavam o segredo do cliente em uma única propriedade "ClientSecret" em vez de "ClientCredentials". Isso ainda é suportado para compatibilidade com versões anteriores, mas você não pode usar a propriedade "ClientSecret" e a coleção "ClientCredentials".

Em vez de um segredo do cliente, você pode fornecer um certificado de cliente. O trecho de código a seguir mostra o uso de um certificado armazenado no Cofre de Chaves do Azure.

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

Aviso

Se você esquecer de alterar o Scopes para uma matriz, quando tentar usar os IDownstreamApi escopos aparecerá nulo e IDownstreamApi tentará uma chamada anônima (não autenticada) para a API downstream, o que resultará em um 401/unauthenticatedarquivo .

Microsoft.Identity.Web fornece várias maneiras de descrever certificados, tanto por configuração quanto por código. Para obter detalhes, consulte Microsoft.Identity.Web - Usando certificados no GitHub.

Program.cs

using Microsoft.Identity.Web;

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

Uma API da Web precisa adquirir um token para a API downstream. Especifique-o adicionando a .EnableTokenAcquisitionToCallDownstreamApi() linha após .AddMicrosoftIdentityWebApi(Configuration). Esta linha expõe o ITokenAcquisition serviço que pode ser usado nas ações controlador/páginas.

No entanto, um método alternativo é implementar um cache de token. Por exemplo, adicionar .AddInMemoryTokenCaches(), a Program.cs permite que o token seja armazenado em cache na memória.

using Microsoft.Identity.Web;

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

Microsoft.Identity.Web fornece dois mecanismos para chamar uma API da Web downstream de outra API. A opção escolhida depende se você deseja chamar o Microsoft Graph ou outra API.

Opção 1: Chamar o Microsoft Graph

Para chamar o Microsoft Graph, Microsoft.Identity.Web permite que você use diretamente o GraphServiceClient (exposto pelo SDK do Microsoft Graph) nas ações da API.

Nota

Há um problema contínuo para o Microsoft Graph SDK v5+. Para obter mais informações, consulte o problema do GitHub.

Para expor o Microsoft Graph:

  1. Adicione o pacote NuGet Microsoft.Identity.Web.GraphServiceClient ao projeto.
  2. Adicione .AddMicrosoftGraph() depois .EnableTokenAcquisitionToCallDownstreamApi() em Program.cs. .AddMicrosoftGraph() tem várias substituições. Usando a substituição que usa uma seção de configuração como parâmetro, o código se torna:
using Microsoft.Identity.Web;

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

Opção 2: Chamar uma API da Web downstream diferente do Microsoft Graph

  1. Adicione o pacote NuGet Microsoft.Identity.Web.DownstreamApi ao projeto.
  2. Adicione .AddDownstreamApi() depois .EnableTokenAcquisitionToCallDownstreamApi() em Program.cs. O código torna-se:
using Microsoft.Identity.Web;

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

em que;

  • MyApi indica o nome da API da Web downstream que sua API da Web pretende chamar
  • MyApiScope é o escopo necessário para sua API da Web solicitar para interagir com a API da Web downstream

Esses valores serão representados em seu JSON que será semelhante ao trecho a seguir.

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

Se o aplicativo Web precisar chamar outro recurso de API, repita o .AddDownstreamApi() método com o escopo relevante, conforme mostrado no seguinte trecho:

using Microsoft.Identity.Web;

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

Observe que .EnableTokenAcquisitionToCallDownstreamApi é chamado sem qualquer parâmetro, o que significa que o token de acesso é adquirido exatamente no tempo em que o controlador solicita o token especificando o escopo.

O escopo também pode ser passado ao chamar .EnableTokenAcquisitionToCallDownstreamApi, o que faria com que o aplicativo Web adquirisse o token durante o próprio login inicial do usuário. O token será então retirado do cache quando o controlador o solicitar.

Semelhante aos aplicativos Web, várias implementações de cache de token podem ser escolhidas. Para obter detalhes, consulte Microsoft identity web - Serialização de cache de token no GitHub.

A imagem a seguir mostra as possibilidades do Microsoft.Identity.Web e o impacto no 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 entender completamente os exemplos de código aqui, esteja familiarizado com os fundamentos do ASP.NET Core e, em particular, com a injeção de dependência e as opções.

Você também pode ver um exemplo de implementação de fluxo OBO no Node.js e no Azure Functions.

Protocolo

Para obter mais informações sobre o protocolo OBO, consulte a plataforma de identidade da Microsoft e o fluxo OAuth 2.0 On-Behalf-Of.

Próximos passos

Passe para o próximo artigo neste cenário, Adquirir um token para o aplicativo.