Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: Locatários de trabalho
Locatários externos (saiba mais)
Este artigo descreve como configurar o código para uma aplicação de API web usando o fluxo de autorização por código OAuth 2.0.
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.
Pré-requisitos
Configurar o aplicativo
Escolha um idioma para sua API da Web.
Segredos do cliente ou certificados do cliente
Como a sua aplicação web agora chama uma API web downstream, forneça um client secret ou um certificado de cliente no ficheiro appsettings.json. Você também pode adicionar uma seção que especifique:
- A URL da API Web a jusante
- 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". Ainda é suportado para compatibilidade retroativa, mas não é possível usar a propriedade "ClientSecret" e a coleção "ClientCredentials" simultaneamente.
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 te esqueceres de alterar o Scopes
para uma matriz, quando tentares usar os IDownstreamApi
escopos aparecerão nulos e IDownstreamApi
tentará uma chamada anónima (não autenticada) para a API descendente, o que resultará num 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.
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 serviço ITokenAcquisition
que pode ser utilizado nas ações do controlador e das 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:
- Adicione o pacote NuGet Microsoft.Identity.Web.GraphServiceClient ao projeto.
- Adicione
.AddMicrosoftGraph()
depois.EnableTokenAcquisitionToCallDownstreamApi()
em Program.cs..AddMicrosoftGraph()
tem várias substituições. Usando a sobrescrição que utiliza uma seção de configuração como parâmetro, o código fica:
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
- Adicione o pacote NuGet Microsoft.Identity.Web.DownstreamApi ao projeto.
- 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();
// ...
onde
-
MyApi
indica o nome da API da Web downstream que sua API da Web pretende chamar -
MyApiScope
é o escopo necessário para a sua API web solicitar para interagir com a API 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 do cache de token no GitHub.
A imagem a seguir mostra as possibilidades do Microsoft.Identity.Web e o impacto no Program.cs:
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 o Microsoft identity platform and OAuth 2.0 On-Behalf-Of flow.