Compartilhar via


Um aplicativo Web que chama as APIs Web: Configuração do código

Aplica-se a: Círculo verde com um símbolo de marca de seleção branca que indica que o conteúdo a seguir se aplica aos locatários da força de trabalho. Locatários da força de trabalho (saiba mais)

Este artigo mostrará como configurar o código do aplicativo e modificar seu aplicativo Web para que ele não apenas conecte os usuários, como também chame as APIs Web. O aplicativo criado por você usa o fluxo de código de autorização OAuth 2.0 para conectar o usuário. Esse fluxo tem duas etapas:

  1. Solicitar um código de autorização. Esta parte delega um diálogo particular com o usuário para a plataforma de identidade da Microsoft. Durante esse diálogo, o usuário se conecta e dá consentimento para o uso das APIs Web. Quando o diálogo particular 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.

Pré-requisitos

  • Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente. Essa conta deve ter permissões para gerenciar aplicativos. Use qualquer uma das seguintes funções necessárias para registrar o aplicativo:
    • Administrador de aplicativos
    • Desenvolvedor de aplicativos
  • Registre um novo aplicativo no Centro de administração do Microsoft Entra, configurado apenas para Contas neste diretório organizacional. Consulte Registrar um aplicativo para obter mais detalhes. Registre os seguintes valores na página visão geral do aplicativo para uso posterior:
    • ID do aplicativo (cliente)
    • ID do diretório (locatário)

Bibliotecas Microsoft com suporte a aplicativos Web

As seguintes bibliotecas da Microsoft são compatíveis com aplicativos Web:

Idioma / estrutura Projeto em
GitHub
Pacote Introdução
iniciado
Conectar usuários Acessar APIs da Web Geralmente disponíveis (GA) ou
Visualização pública1
.NET MSAL.NET Microsoft.Identity.Client A biblioteca não pode solicitar tokens de ID para login 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 login do usuário. 2 A biblioteca não pode solicitar tokens de acesso para APIs da Web protegidas. 2 GA
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Início rápido A biblioteca pode solicitar tokens de ID para entrada do 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 entrada do 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 entrada do usuário. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. GA
Node.js Nó MSAL msal-node Início rápido A biblioteca pode solicitar tokens de ID para entrada do 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 entrada do 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 entrada do 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 se aplicam a bibliotecas em Visualização Pública.

(2) A biblioteca Microsoft.IdentityModel apenas valida os tokens. Ela não pode solicitar ID ou acessar os tokens.

Selecione a guia para a plataforma em que você está interessado:

Segredos do cliente ou certificados do cliente

Considerando que sua API Web agora recorre a uma API Web downstream, forneça um segredo do cliente ou um certificado do cliente no arquivo appsettings.json. Você também pode adicionar uma seção que especifica:

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

No exemplo a seguir, a seção GraphBeta 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"]
    }
}

Observação

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 o Kubernetes do Azure. As versões anteriores do Microsoft.Identity.Web expressam o segredo do cliente em uma única propriedade "ClientSecret" em vez de "ClientCredentials". Ela ainda tem suporte 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 do cliente. O snippet de código a seguir mostra o uso de um certificado armazenado no 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"]
  }
}

Aviso

Se você esquecer de alterar 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/unauthenticated.

O Microsoft.Identity.Web fornece várias maneiras de descrever os certificados, tanto por configuração quanto por código. Para obter mais detalhes, confira o Microsoft.Identity.Web – usando certificados no GitHub.

Modifique o arquivo Startup.cs

Seu aplicativo Web precisará adquirir um token para a API downstream. Você o especifica adicionando a linha .EnableTokenAcquisitionToCallDownstreamApi() após .AddMicrosoftIdentityWebApp(Configuration). Essa linha expõe o serviço IAuthorizationHeaderProvider, que você pode usar em suas ações de página e controlador. No entanto, como você pode ver 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 ao fazer logon. Se você não especificar os escopos, o Microsoft.Identity.Web habilitará uma experiência de consentimento incremental.

Microsoft.Identity.Web oferece dois mecanismos para chamar uma API Web a partir 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 recorrer ao Microsoft Graph, o Microsoft.Identity.Web permitirá 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 de .EnableTokenAcquisitionToCallDownstreamApi() no arquivo Startup.cs. .AddMicrosoftGraph() tem várias substituições. Usando a substituição que tem uma seção de configuração como um 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 Web downstream diferente do Microsoft Graph

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

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

  2. Adicione .AddDownstreamApi() depois de .EnableTokenAcquisitionToCallDownstreamApi() no arquivo Startup.cs. .AddDownstreamApi() tem dois argumentos e é mostrado no trecho de código a seguir:

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

Resumo

Assim como acontece com as APIs da Web, você pode escolher várias implementações de cache de token. Para obter mais detalhes, confira Microsoft Identity Web – serialização de cache de token no GitHub.

A seguinte imagem mostra as várias possibilidades do Microsoft.Identity.Web e o impacto no arquivo Startup.cs:

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

Observação

Para entender totalmente os exemplos de código aqui, você precisa estar familiarizado com os conceitos básicos do ASP.NET Core e, particularmente, com a injeção de dependência e as opções.

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

O Microsoft. Identity. Web simplifica seu código definindo as configurações corretas do OpenID Connect, inscrevendo-se no evento de código recebido e resgatando o código. Nenhum código adicional é 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 asserção de cliente. O uso de asserções de cliente é um cenário avançado, detalhado na Declarações de cliente.

Cache de token

Importante

A implementação do cache de tokens para aplicativos Web ou APIs 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 Web e APIs Web, haja um cache de token por conta de usuário. Você deve serializar o cache de token para cada conta.

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

Próxima etapa

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