Partilhar via


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

Aplica-se a: círculo verde com um símbolo de marca de seleção branco que indica que o conteúdo a seguir se aplica aos locatários da força de trabalho. Inquilinos 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, mas também chame APIs da Web. A aplicação que cria utiliza o fluxo de autorização de código OAuth 2.0 para iniciar sessão para o utilizador. 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.

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
    • Programador de Aplicações
  • Registre um novo aplicativo no centro de administração do Microsoft Entra, configurado para Contas somente neste diretório organizacional. Consulte Registar uma candidatura para obter mais detalhes. Registre os seguintes valores na página Visão geral do aplicativo para uso posterior:
    • ID da aplicação (cliente)
    • ID do diretório (inquilino)

Bibliotecas da Microsoft que suportam aplicações Web

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

Linguagem / estrutura Projeto em
GitHub
Pacote Como obter
começar
Iniciar sessão de utilizadores Aceder a APIs Web Geralmente disponível (GA) ou
Prévia pú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. disponibilidade geral
.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 disponibilidade geral
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web Início rápido A biblioteca pode solicitar tokens de ID para o início de sessão do utilizador. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. disponibilidade geral
Java MSAL4J MSAL4J Início rápido A biblioteca pode solicitar tokens de ID para o início de sessão do utilizador. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. disponibilidade geral
Primavera spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Tutoriais A biblioteca pode solicitar tokens de ID para o início de sessão do utilizador. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. disponibilidade geral
Node.js Nó MSAL msal-node Início rápido A biblioteca pode solicitar tokens de ID para o início de sessão do utilizador. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. disponibilidade geral
Python MSAL Python MSAL A biblioteca pode solicitar tokens de ID para o início de sessão do utilizador. A biblioteca pode solicitar tokens de acesso para APIs da Web protegidas. disponibilidade geral
Python identidade identidade Início rápido A biblioteca pode solicitar tokens de ID para o início de sessão do utilizador. 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 às 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

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

  • A URL da API Web de 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 não pode utilizar tanto a propriedade "ClientSecret" como 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 se esquecer de alterar o Scopes para um vetor, quando tentar usar os IDownstreamApi, os escopos aparecerão nulos e o IDownstreamApi tentará uma chamada anónima (não autenticada) para a API a jusante, o que resultará num erro 401/unauthenticated.

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.

Modificar o arquivo 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 serviço IAuthorizationHeaderProvider que pode ser utilizado nas 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 a sua aplicação web solicite os escopos e o consentimento do utilizador para esses escopos quando iniciarem sessão. 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 token cache 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 do serviço em startup.cs para chamar uma API 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 o seu código, definindo as configurações corretas do OpenID Connect, subscrevendo 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 ASP.NET Core caches de memória distribuída:

// 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 Token cache serialization do Microsoft.Identity.Web e a fase de caches de token dos tutoriais de aplicativos Web ASP.NET Core.

Próximo passo

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.