Cadeias de credenciais na biblioteca de Identidades do Azure para .NET
A biblioteca de Identidade do Azure fornece credenciais — classes públicas derivadas da classe TokenCredential da biblioteca do Azure Core. Uma credencial representa um fluxo de autenticação distinto para adquirir um token de acesso do Microsoft Entra ID. Essas credenciais podem ser encadeadas para formar uma sequência ordenada de mecanismos de autenticação a serem tentados.
Como funciona uma credencial encadeada
No tempo de execução, uma cadeia de credenciais tenta autenticar usando a primeira credencial da sequência. Se essa credencial não conseguir adquirir um token de acesso, a próxima credencial na sequência será tentada, e assim por diante, até que um token de acesso seja obtido com êxito. O diagrama de sequência a seguir ilustra esse comportamento:
Por que usar cadeias de credenciais
Uma credencial encadeada pode oferecer os seguintes benefícios:
Reconhecimento do ambiente: seleciona automaticamente a credencial mais apropriada com base no ambiente no qual o aplicativo está sendo executado. Sem ele, você teria que escrever um código como este:
TokenCredential credential; if (app.Environment.IsProduction() || app.Environment.IsStaging()) { credential = new ManagedIdentityCredential(clientId: userAssignedClientId); } else { // local development environment credential = new VisualStudioCredential(); }
Transições perfeitas: seu aplicativo pode passar do desenvolvimento local para o ambiente de preparação ou produção sem alterar o código de autenticação.
Resiliência aprimorada: inclui um mecanismo de fallback que se move para a próxima credencial quando o anterior não consegue adquirir um token de acesso.
Como escolher uma credencial encadeada
Existem duas filosofias diferentes para o encadeamento de credenciais:
- "Derrubar" uma cadeia: comece com uma cadeia pré-configurada e exclua o que você não precisa. Para essa abordagem, consulte a seção Visão geral de DefaultAzureCredential.
- "Construa" uma cadeia: comece com uma cadeia vazia e inclua apenas o que você precisa. Para essa abordagem, consulte a seção Visão geral de ChainedTokenCredential.
Visão geral de DefaultAzureCredential
DefaultAzureCredential é uma cadeia de credenciais opinativa e pré-configurada. Ele foi projetado para suportar muitos ambientes, juntamente com os fluxos de autenticação mais comuns e ferramentas de desenvolvedor. Na forma gráfica, a cadeia subjacente tem esta aparência:
A ordem em que DefaultAzureCredential
as credenciais de tentativa seguem.
Ordenar | Credencial | Description | Ativado por predefinição? |
---|---|---|---|
1 | Ambiente | Lê uma coleção de variáveis de ambiente para determinar se uma entidade de serviço de aplicativo (usuário do aplicativo) está configurada para o aplicativo. Em caso afirmativo, DefaultAzureCredential usa esses valores para autenticar o aplicativo no Azure. Este método é mais frequentemente usado em ambientes de servidor, mas também pode ser usado ao desenvolver localmente. |
Sim |
2 | Identidade da carga de trabalho | Se o aplicativo for implantado em um host do Azure com a Identidade da Carga de Trabalho habilitada, autentique essa conta. | Sim |
3 | Identidade Gerida | Se o aplicativo for implantado em um host do Azure com a Identidade Gerenciada habilitada, autentique o aplicativo no Azure usando essa Identidade Gerenciada. | Sim |
4 | Visual Studio | Se o desenvolvedor se autenticou no Azure fazendo logon no Visual Studio, autentique o aplicativo no Azure usando essa mesma conta. | Sim |
5 | CLI do Azure | Se o desenvolvedor se autenticou no Azure usando o comando da CLI do az login Azure, autentique o aplicativo no Azure usando essa mesma conta. |
Sim |
6 | Azure PowerShell | Se o desenvolvedor se autenticou no Azure usando o cmdlet do Connect-AzAccount Azure PowerShell, autentique o aplicativo no Azure usando essa mesma conta. |
Sim |
7 | CLI do desenvolvedor do Azure | Se o desenvolvedor se autenticou no Azure usando o comando da CLI do azd auth login Azure Developer, autentique-se com essa conta. |
Sim |
8 | Navegador interativo | Se ativado, autentique interativamente o desenvolvedor através do navegador padrão do sistema atual. | Não |
Em sua forma mais simples, você pode usar a versão sem parâmetros da DefaultAzureCredential
seguinte maneira:
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
DefaultAzureCredential credential = new();
clientBuilder.UseCredential(credential);
});
Gorjeta
O UseCredential
método no trecho de código anterior é recomendado para uso em aplicativos ASP.NET Core. Para obter mais informações, consulte Usar o SDK do Azure para .NET em aplicativos ASP.NET Core.
Como personalizar DefaultAzureCredential
Para remover uma credencial do DefaultAzureCredential
, use a propriedade -prefixed correspondente Exclude
em DefaultAzureCredentialOptions. Por exemplo:
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new DefaultAzureCredential(
new DefaultAzureCredentialOptions
{
ExcludeEnvironmentCredential = true,
ExcludeWorkloadIdentityCredential = true,
ManagedIdentityClientId = userAssignedClientId,
}));
});
No exemplo EnvironmentCredential
de código anterior e WorkloadIdentityCredential
são removidos da cadeia de credenciais. Como resultado, a primeira credencial a ser tentada é ManagedIdentityCredential
. A cadeia modificada tem esta aparência:
Nota
InteractiveBrowserCredential
é excluído por padrão e, portanto, não é mostrado no diagrama anterior. Para incluir InteractiveBrowserCredential
, passe true
para o construtor DefaultAzureCredential(Boolean) ou defina a propriedade DefaultAzureCredentialOptions.ExcludeInteractiveBrowserCredential como false
.
À medida que mais Exclude
propriedades prefixadas são definidas como true
(exclusões de credenciais são configuradas), as vantagens do uso DefaultAzureCredential
diminuem. Nesses casos, ChainedTokenCredential
é uma escolha melhor e requer menos código. Para ilustrar, esses dois exemplos de código se comportam da mesma maneira:
credential = new DefaultAzureCredential(
new DefaultAzureCredentialOptions
{
ExcludeEnvironmentCredential = true,
ExcludeWorkloadIdentityCredential = true,
ExcludeAzureCliCredential = true,
ExcludeAzurePowerShellCredential = true,
ExcludeAzureDeveloperCliCredential = true,
ManagedIdentityClientId = userAssignedClientId
});
Visão geral de ChainedTokenCredential
ChainedTokenCredential é uma cadeia vazia à qual você adiciona credenciais para atender às necessidades do seu aplicativo. Por exemplo:
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new ChainedTokenCredential(
new ManagedIdentityCredential(clientId: userAssignedClientId),
new VisualStudioCredential()));
});
O exemplo de código anterior cria uma cadeia de credenciais personalizada composta por duas credenciais. A variante de identidade gerenciada atribuída pelo usuário é tentada ManagedIdentityCredential
primeiro, seguida por VisualStudioCredential
, se necessário. Em forma gráfica, a cadeia tem esta aparência:
Gorjeta
Para melhorar o desempenho, otimize o pedido de credenciais para ChainedTokenCredential
seu ambiente de produção. As credenciais destinadas ao uso no ambiente de desenvolvimento local devem ser adicionadas por último.
Diretrizes de uso para DefaultAzureCredential
DefaultAzureCredential
é, sem dúvida, a maneira mais fácil de começar a usar a biblioteca de Identidades do Azure, mas com essa conveniência surgem compensações. Depois de implantar seu aplicativo no Azure, você deve entender os requisitos de autenticação do aplicativo. Por esse motivo, considere fortemente passar DefaultAzureCredential
de uma das seguintes soluções:
- Uma implementação específica
TokenCredential
, comoManagedIdentityCredential
. Consulte a lista Derivados para obter opções. - Uma implementação reduzida
ChainedTokenCredential
otimizada para o ambiente do Azure no qual seu aplicativo é executado.
Aqui está o porquê:
- Desafios de depuração: quando a autenticação falha, pode ser difícil depurar e identificar a credencial infratora. Você deve habilitar o registro para ver a progressão de uma credencial para a próxima e o status de sucesso/falha de cada uma. Para obter mais informações, consulte Depurar uma credencial encadeada.
- Sobrecarga de desempenho: o processo de tentar sequencialmente várias credenciais pode introduzir sobrecarga de desempenho. Por exemplo, quando executado em uma máquina de desenvolvimento local, a identidade gerenciada não está disponível. Consequentemente,
ManagedIdentityCredential
sempre falha no ambiente de desenvolvimento local, a menos que explicitamente desativado através de sua propriedade pré-fixada correspondenteExclude
. - Comportamento imprevisível:
DefaultAzureCredential
verifica a presença de determinadas variáveis de ambiente. É possível que alguém possa adicionar ou modificar essas variáveis de ambiente no nível do sistema na máquina host. Essas alterações se aplicam globalmente e, portanto, alteram o comportamento do tempo deDefaultAzureCredential
execução em qualquer aplicativo em execução nessa máquina.
Depurar uma credencial encadeada
Para diagnosticar um problema inesperado ou entender o que uma credencial encadeada está fazendo, habilite o registro em log em seu aplicativo. Opcionalmente, filtre os logs apenas para os eventos emitidos pela biblioteca de Identidades do Azure. Por exemplo:
using AzureEventSourceListener listener = new((args, message) =>
{
if (args is { EventSource.Name: "Azure-Identity" })
{
Console.WriteLine(message);
}
}, EventLevel.LogAlways);
Para fins de ilustração, suponha que a forma sem parâmetros do foi usada para autenticar uma solicitação em um espaço de trabalho do DefaultAzureCredential
Log Analytics. O aplicativo foi executado no ambiente de desenvolvimento local e o Visual Studio foi autenticado em uma conta do Azure. Na próxima vez que o aplicativo foi executado, as seguintes entradas pertinentes apareceram na saída:
DefaultAzureCredential.GetToken invoked. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342
EnvironmentCredential.GetToken invoked. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342
EnvironmentCredential.GetToken was unable to retrieve an access token. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342 Exception: Azure.Identity.CredentialUnavailableException (0x80131500): EnvironmentCredential authentication unavailable. Environment variables are not fully configured. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/environmentcredential/troubleshoot
WorkloadIdentityCredential.GetToken invoked. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342
WorkloadIdentityCredential.GetToken was unable to retrieve an access token. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342 Exception: Azure.Identity.CredentialUnavailableException (0x80131500): WorkloadIdentityCredential authentication unavailable. The workload options are not fully configured. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/workloadidentitycredential/troubleshoot
ManagedIdentityCredential.GetToken invoked. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342
ManagedIdentityCredential.GetToken was unable to retrieve an access token. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342 Exception: Azure.Identity.CredentialUnavailableException (0x80131500): ManagedIdentityCredential authentication unavailable. No response received from the managed identity endpoint.
VisualStudioCredential.GetToken invoked. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342
VisualStudioCredential.GetToken succeeded. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342 ExpiresOn: 2024-08-13T17:16:50.8023621+00:00
DefaultAzureCredential credential selected: Azure.Identity.VisualStudioCredential
DefaultAzureCredential.GetToken succeeded. Scopes: [ https://api.loganalytics.io//.default ] ParentRequestId: d7ef15d1-50f8-451d-afeb-6b06297a3342 ExpiresOn: 2024-08-13T17:16:50.8023621+00:00
Na saída anterior, observe que:
EnvironmentCredential
,WorkloadIdentityCredential
eManagedIdentityCredential
cada um não conseguiu adquirir um token de acesso do Microsoft Entra, nessa ordem.- A
DefaultAzureCredential credential selected:
entrada -prefixed indica a credencial que foi selecionada —VisualStudioCredential
neste caso. Desde queVisualStudioCredential
foi bem-sucedido, nenhuma credencial além dele foi usada.