Práticas recomendadas de autenticação com a biblioteca de Identidade do Azure para .NET
Este artigo oferece diretrizes para ajudá-lo a maximizar o desempenho e a confiabilidade de seus aplicativos .NET ao autenticar nos serviços do Azure. Para aproveitar ao máximo a biblioteca de Identidade do Azure para .NET, é importante entender possíveis problemas e técnicas de mitigação.
Usar credenciais determinísticas em ambientes de produção
DefaultAzureCredential
é a maneira mais acessível de começar a usar a biblioteca de Identidade do Azure, mas essa conveniência também apresenta determinadas compensações. Em especial, a credencial específica na cadeia que terá êxito e será usada para autenticação de solicitação não pode ser garantida antecipadamente. Em um ambiente de produção, essa imprevisibilidade pode introduzir problemas significativos e às vezes sutis.
Por exemplo, considere a seguinte sequência hipotética de eventos:
- A equipe de segurança de uma organização determina que todos os aplicativos usem a identidade gerenciada para se autenticar nos recursos do Azure.
- Durante meses, um aplicativo .NET hospedado em uma VM (Máquina Virtual) do Azure usa com êxito
DefaultAzureCredential
para autenticar por meio de identidade gerenciada. - Sem avisar a equipe de suporte, um desenvolvedor instala a CLI do Azure nessa VM e executa o comando
az login
para autenticar no Azure. - Devido a uma alteração de configuração separada no ambiente do Azure, a autenticação por meio da identidade gerenciada original inesperadamente começa a falhar silenciosamente.
-
DefaultAzureCredential
ignora oManagedIdentityCredential
com falha e procura a próxima credencial disponível, que éAzureCliCredential
. - O aplicativo começa a utilizar as credenciais da CLI do Azure em vez da identidade gerenciada, o que pode falhar ou resultar em elevação inesperada ou redução de privilégios.
Para evitar esses tipos de problemas sutis ou falhas silenciosas em aplicativos de produção, considere a mudança de DefaultAzureCredential
para uma das seguintes soluções determinísticas:
- Uma implementação de
TokenCredential
específica, comoManagedIdentityCredential
. Confira a lista derivada para opções. - Uma implementação simplificada de
ChainedTokenCredential
otimizada para o ambiente do Azure no qual seu aplicativo é executado.ChainedTokenCredential
essencialmente cria uma lista de permissões específica de opções de credencial aceitáveis, comoManagedIdentity
para produção eVisualStudioCredential
para desenvolvimento.
Por exemplo, considere a seguinte configuração de DefaultAzureCredential
em um projeto do ASP.NET Core:
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
DefaultAzureCredential credential = new();
clientBuilder.UseCredential(credential);
});
Substitua o código anterior por uma implementação ChainedTokenCredential
que especifica apenas as credenciais necessárias:
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()));
});
Neste exemplo, ManagedIdentityCredential
seria descoberto automaticamente na produção, enquanto VisualStudioCredential
funcionaria em ambientes de desenvolvimento local.
Reutilizar instâncias de credenciais
Reutilize instâncias de credencial quando possível para melhorar a resiliência do aplicativo e reduzir o número de solicitações de token de acesso emitidas para a ID do Microsoft Entra. Quando uma credencial é reutilizada, é feita uma tentativa de buscar um token do cache de token de aplicativo gerenciado pela dependência subjacente do MSAL. Para obter mais informações, consulte Cache de token na biblioteca de cliente do Azure Identity.
Importante
Um aplicativo de alto volume que não reutiliza credenciais pode encontrar respostas de limitação de HTTP 429 do Microsoft Entra ID, o que pode levar a interrupções do aplicativo.
A estratégia de reutilização de credencial recomendada difere pelo tipo de aplicativo .NET.
Implementar a reutilização de credenciais por meio do método UseCredential de Microsoft.Extensions.Azure
. Por exemplo, imagine um aplicativo ASP.NET Core hospedado no Serviço de Aplicativo do Azure, com um conjunto de variáveis de ambiente UserAssignedClientId
. O provedor de configuração do .NET determina que a variável de ambiente existe, e ManagedIdentityCredential
será usado para autenticar os segredos do Key Vault e os clientes do Armazenamento de Blobs. Caso contrário, uma sequência encadeada de credenciais de tempo de desenvolvimento é usada.
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddSecretClient(new Uri("<key-vault-url>"));
clientBuilder.AddBlobServiceClient(new Uri("<blob-storage-url>"));
string? clientId = builder.Configuration["UserAssignedClientId"];
TokenCredential credential = clientId is not null
? new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedClientId(clientId))
: new ChainedTokenCredential(
new VisualStudioCredential(),
new AzureCliCredential(),
new AzurePowerShellCredential());
clientBuilder.UseCredential(credential);
});
Para obter informações sobre essa abordagem, consulte Autenticar usando o Microsoft Entra ID.
Entender quando o tempo de vida do token e a lógica de cache são necessários
Se você usar uma credencial da biblioteca de identidade do Azure fora do contexto de uma biblioteca de cliente do Azure SDK que depende do Azure Core, torna-se sua responsabilidade gerenciar o tempo de vida do token e o comportamento de cache no seu aplicativo.
A propriedade RefreshOn no AccessToken
, que fornece uma dica aos consumidores sobre quando a atualização de token pode ser tentada, será usada automaticamente pelas bibliotecas de clientes do SDK do Azure que dependem da biblioteca do Azure Core para atualizar o token. Para uso direto de credenciais da biblioteca de identidade do Azure que oferecem suporte ao cache de tokens, o cache MSAL subjacente é atualizado automaticamente de forma proativa quando RefreshOn
chega a hora. Esse design permite que o código do cliente chame GetToken
sempre que um token for necessário e delegar a atualização para a biblioteca.
Para apenas chamar GetToken
quando necessário, observe a data RefreshOn
e tente atualizar o token proativamente após esse período. A implementação específica cabe ao cliente.
Compreender a estratégia de repetição de identidade gerenciada
A biblioteca de identidades do Azure para .NET permite que você se autentique por meio de identidade gerenciada com ManagedIdentityCredential
. A maneira como você usa ManagedIdentityCredential
afeta a estratégia de repetição aplicada. Quando usado por meio de:
-
DefaultAzureCredential
, nenhuma tentativa será feita quando a tentativa inicial de aquisição de token falhar ou atingir o tempo limite após um curto período. Essa é a opção menos resiliente porque é otimizada para "falhar rapidamente" para um loop interno de desenvolvimento eficiente. - Qualquer outra abordagem, como
ChainedTokenCredential
ouManagedIdentityCredential
diretamente:O intervalo de tempo entre novas tentativas começa por 0,8 segundo, e, por padrão, um máximo de cinco novas tentativas é realizado. Essa opção é otimizada para resiliência, mas introduz atrasos potencialmente indesejados no loop interno de desenvolvimento.
Para alterar qualquer uma das configurações de repetição padrão, use a propriedade
Retry
emManagedIdentityCredentialOptions
. Por exemplo, tente novamente um máximo de três vezes, com um intervalo inicial de 0,5 segundos:ManagedIdentityCredentialOptions miCredentialOptions = new( ManagedIdentityId.FromUserAssignedClientId(clientId) ) { Retry = { MaxRetries = 3, Delay = TimeSpan.FromSeconds(0.5), } }; ChainedTokenCredential tokenChain = new( new ManagedIdentityCredential(miCredentialOptions), new VisualStudioCredential() );
Para obter mais informações sobre como personalizar políticas de repetição, consulte Definir uma política de repetição personalizada.