Um aplicativo Web que chama APIs da Web: configuração de código

Conforme mostrado no cenário de aplicativo Web que entra em usuários, o aplicativo Web usa o fluxo de código de autorização OAuth 2.0 para entrar no usuário. Este fluxo tem duas etapas:

  1. Peça um código de autorização. Esta parte delega um diálogo privado com o usuário à plataforma de identidade da Microsoft. Durante esse diálogo, o usuário entra e consente com o uso de APIs da Web. Quando o diálogo privado termina com êxito, o aplicativo Web recebe um código de autorização em seu URI de redirecionamento.
  2. Solicite um token de acesso para a API resgatando o código de autorização.

O aplicativo Web que entra em cenários de usuários cobriu apenas a primeira etapa. Aqui você aprende como modificar seu aplicativo Web para que ele não apenas faça login nos usuários, mas também chame APIs da Web.

Bibliotecas da Microsoft que suportam aplicações Web

As seguintes bibliotecas da Microsoft suportam aplicações Web:

Linguagem / framework Projeto em
GitHub
Pacote Como obter
começar
Iniciar sessão de utilizadores Aceder a APIs Web Geralmente disponível (GA) ou
Pré-visualizaçãopública 1
.NET MSAL.NET Microsoft.Identity.Client A biblioteca não pode solicitar tokens de ID para entrada do usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. GA
.NET Microsoft.IdentityModel Microsoft.IdentityModel A biblioteca não pode solicitar tokens de ID para entrada do usuário.2 A biblioteca não pode solicitar tokens de acesso para APIs da Web protegidas.2 GA
ASP.NET Core ASP.NET Core Microsoft.AspNetCore.Authentication Início rápido A biblioteca pode solicitar tokens de ID para entrar no usuário. A biblioteca não pode solicitar tokens de acesso para APIs da Web protegidas. GA
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Início rápido A biblioteca pode solicitar tokens de ID para entrar no usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. GA
Java MSAL4J MSAL4J Início rápido A biblioteca pode solicitar tokens de ID para entrar no usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. GA
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Tutorial A biblioteca pode solicitar tokens de ID para entrar no usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. GA
Node.js Nó MSAL msal-nó Início rápido A biblioteca pode solicitar tokens de ID para entrar no usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. GA
Python MSAL Python MSAL A biblioteca pode solicitar tokens de ID para entrar no usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. GA
Python identidade identidade Início rápido A biblioteca pode solicitar tokens de ID para entrar no usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. --

(1)Os Termos de Licença Universal para Serviços Online aplicam-se a bibliotecas na Pré-visualização Pública.

(2) A biblioteca Microsoft.IdentityModel apenas valida tokens - não pode solicitar ID ou tokens de acesso.

Selecione o separador para a plataforma em que está interessado:

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.

Startup.cs

Seu aplicativo Web precisa adquirir um token para a API downstream. Para especificar, adicione a .EnableTokenAcquisitionToCallDownstreamApi() linha após .AddMicrosoftIdentityWebApp(Configuration). Esta linha expõe o IAuthorizationHeaderProvider serviço que você pode usar em suas ações de controlador e página. No entanto, como você vê nas duas opções a seguir, isso pode ser feito de forma mais simples. Você também precisa escolher uma implementação de cache de token, por exemplo .AddInMemoryTokenCaches(), em 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();
   // ...
  }
  // ...
}

Os escopos passados para EnableTokenAcquisitionToCallDownstreamApi são opcionais e permitem que seu aplicativo Web solicite os escopos e o consentimento do usuário para esses escopos quando entrar. Se você não especificar os escopos, Microsoft.Identity.Web habilitará uma experiência de consentimento incremental.

Microsoft.Identity.Web oferece dois mecanismos para chamar uma API Web de um aplicativo Web sem que você precise adquirir um token. A opção escolhida depende se você deseja chamar o Microsoft Graph ou outra API.

Opção 1: Chamar o Microsoft Graph

Se você quiser chamar o Microsoft Graph, Microsoft.Identity.Web permite que você use diretamente o GraphServiceClient (exposto pelo SDK do Microsoft Graph) em suas ações de API. Para expor o Microsoft Graph:

  1. Adicione o pacote NuGet Microsoft.Identity.Web.GraphServiceClient ao seu projeto.

  2. Adicione .AddMicrosoftGraph() depois .EnableTokenAcquisitionToCallDownstreamApi() no arquivo Startup.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;
    
    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();
       // ...
      }
      // ...
    }
    

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

Se você quiser chamar uma API diferente do Microsoft Graph, Microsoft.Identity.Web permitirá que você use a interface em suas ações de IDownstreamApi API. Para usar esta interface:

  1. Adicione o pacote NuGet Microsoft.Identity.Web.DownstreamApi ao seu projeto.

  2. Adicione .AddDownstreamApi() depois .EnableTokenAcquisitionToCallDownstreamApi() no arquivo Startup.cs . .AddDownstreamApi() tem dois argumentos e é mostrado no seguinte trecho:

    • O nome de um serviço (API), que é usado nas ações do controlador para fazer referência à configuração correspondente
    • uma seção de configuração que representa os parâmetros usados para chamar a API da 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();
       // ...
      }
      // ...
    }
    

Resumo

Assim como nas APIs da Web, você pode escolher várias implementações de cache de token. Para obter detalhes, consulte Microsoft.Identity.Web - Serialização de cache de token no GitHub.

A imagem a seguir mostra as várias possibilidades de Microsoft.Identity.Web e seu efeito no arquivo Startup.cs :

Diagrama de blocos mostrando opções de configuração de serviço na inicialização ponto C S para chamar uma API da Web e especificar uma implementação de cache de token

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.

Código que resgata o código de autorização

Microsoft.Identity.Web simplifica seu código definindo as configurações corretas do OpenID Connect, assinando o evento de código recebido e resgatando o código. Nenhum código extra é necessário para resgatar o código de autorização. Consulte o código-fonte Microsoft.Identity.Web para obter detalhes sobre como isso funciona.

Em vez de um segredo do cliente, o aplicativo cliente confidencial também pode provar sua identidade usando um certificado de cliente ou uma declaração de cliente. O uso de asserções de cliente é um cenário avançado, detalhado em Asserções de cliente.

Cache de token

Importante

A implementação de cache de tokens para aplicativos Web ou APIs da Web é diferente da implementação para aplicativos de área de trabalho, que geralmente é baseada em arquivos. Por motivos de segurança e desempenho, é importante garantir que, para aplicativos e APIs da Web, haja um cache de token por conta de usuário. Você deve serializar o cache de token para cada conta.

O tutorial ASP.NET principal usa a injeção de dependência para permitir que você decida a implementação do cache de token no arquivo Startup.cs para seu aplicativo. Microsoft.Identity.Web vem com serializadores de cache de token pré-construídos descritos em Serialização de cache de token. Uma possibilidade interessante é escolher caches de memória distribuída 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";
});

Para obter detalhes sobre os provedores de cache de token, consulte também o artigo Serialização de cache de token do Microsoft.Identity.Web e os tutoriais do aplicativo Web ASP.NET Core | Fase de caches de token do tutorial de aplicativos Web.

Próximos passos

Neste ponto, quando o usuário entra, um token é armazenado no cache de tokens. Vamos ver como ele é usado em outras partes do aplicativo Web.

Passe para o próximo artigo neste cenário, Remover contas do cache na saída global.