Diretrizes de migração de AppAuthentication para Azure.Identity
Quando a biblioteca Microsoft.Azure.Services.AppAuthentication foi lançada pela primeira vez no outono de 2017, ela foi projetada especificamente para ajudar a atenuar a questão comum e sistêmica das credenciais no código-fonte. Ele introduziu um novo paradigma para o desenvolvimento de aplicativos que permitia que os desenvolvedores escrevessem código uma vez e permitissem AppAuthentication
que a biblioteca de clientes determinasse como autenticar com base no ambiente do aplicativo , seja em uma estação de trabalho do desenvolvedor usando a conta de um desenvolvedor ou implantada no Azure usando uma identidade de serviço gerenciada. Os desenvolvedores poderiam evitar completamente lidar diretamente com credenciais, simplificando o desenvolvimento e melhorando a segurança, impedindo que as credenciais fossem divulgadas acidentalmente no código-fonte. Dada a simplicidade e os benefícios de segurança, AppAuthentication
foi bem recebido pelos desenvolvedores. O NuGet recebeu mais de 160 milhões de downloads e foi usado em outras bibliotecas e estruturas para serviços do Azure, como o Provedor de Configuração de Key Vault do Azure no .NET Core e o SDK do Microsoft.Azure.ServiceBus.
Lançada no outono de 2019, a biblioteca de clientes do Azure.Identity é a sucessora espiritual da AppAuthentication
biblioteca. O Azure.Identity tem uma grande vantagem em relação AppAuthentication
à sua disponibilidade mais ampla em vários idiomas que fornecem design consistente e uso semelhante nesses idiomas, enquanto AppAuthentication
que só estava disponível para .NET. Além do suporte a várias linguagens, um dos principais recursos de design do Azure.Identity são suas várias implementações da classe abstrata TokenCredential, das quais os SDKs de cliente do Azure mais recentes aceitam. Esses SDKs mais recentes do Azure são facilmente distinguidos por nomes de pacote e namespaces que começam com "Azure", ou seja, "Azure.Identity", "Azure.Storage.Blobs". Para autenticar, o tipo desejado de objeto TokenCredential é instanciado e simplesmente passado diretamente para a classe de cliente do SDK do Azure. Esse design oferece ao uso do Azure.Identity um benefício de segurança adicional sobre o uso de AppAuthentication e SDKs mais antigos que exigem a especificação do token de acesso porque os tokens de acesso não precisam ser tratados diretamente pelo próprio aplicativo. Isso atenua o risco adicional de tokens de acesso serem divulgados acidentalmente por meio de rastreamentos, logs e outras fontes.
Se você estiver iniciando o desenvolvimento de um novo aplicativo, é altamente recomendável usar Azure.Identity
e os novos SDKs de cliente do Azure. Se você tem um aplicativo existente que usa AppAuthentication e deseja usar a Azure.Identity, o caminho preferido é atualizar seu aplicativo para usar os novos SDKs de cliente do Azure que dão suporte à aceitação de TokenCredentials. A AppAuthentication agora é considerada preterida e não haverá mais investimentos em seu desenvolvimento. O uso do DefaultAzureCredential
em Azure.Identity
fornecerá funcionalidade semelhante a AzureServiceTokenProvider
no , em AppAuthentication
que o provedor de autenticação usado será alterado com base no ambiente atual. Se você estiver usando uma cadeia AppAuthentication
de conexão para um provedor de autenticação específico usando AppAuthentication
, consulte a tabela abaixo para ver como usar o mesmo provedor de autenticação criando o TokenCredential apropriado no Azure.Identity.
Provedor de Autenticação | AppAuthentication Cadeia de conexão |
Azure.Identity TokenCredential |
---|---|---|
(Padrão) baseado em ambiente | Padrão – nenhuma cadeia de conexão usada | new DefaultAzureCredential()* |
CLI do Azure | RunAs=Developer; DeveloperTool=AzureCli |
new AzureCliCredential() |
Visual Studio | RunAs=Developer; DeveloperTool=VisualStudio | novo VisualStudioCredential() |
Autenticação Integrada do Windows | RunAs=CurrentUser | Sem suporte |
Identidade gerenciada atribuída pelo sistema | RunAs=App | new ManagedIdentityCredential() |
Identidade gerenciada atribuída pelo usuário | RunAs=App; AppId=appId | new ManagedIdentityCredential(appId) |
Certificado do cliente da entidade de serviço | RunAs=App; AppId=appId; KeyVaultCertificateSecretIdentifier=kvIdentifier |
Sem suporte |
Certificado do cliente da entidade de serviço | RunAs=App; AppId=appId; TenantId=tenantId; CertificateThumbprint=thumbprint; CertificateStoreLocation=location |
new EnvironmentCredential()** new ClientCertificateCredential(tenantId, appId, certObjOrFilePath) |
Certificado do cliente da entidade de serviço | RunAs=App; AppId=appId; TenantId=tenantId; CertificateSubjectName=subject; CertificateStoreLocation=location |
new EnvironmentCredential()** new ClientCertificateCredential(tenantId, appId, certObjOrFilePath) |
Segredo do cliente da entidade de serviço | RunAs=App; AppId=appId; TenantId=tenantId; AppKey=secret |
new EnvironmentCredential()** new ClientSecretCredential(tenantId, appId, secret) |
Observação
*
Os provedores de autenticação e a ordem são diferentes entre AzureServiceTokenProvider e DefaultAzureCredential
**
Precisa definir variáveis de ambiente
Embora o Azure.Identity dê suporte à maioria dos cenários e provedores de autenticação que a AppAuthentication tem, há alguns cenários e recursos que atualmente não têm suporte:
Provedor de autenticação integrada do Windows
Implementação de System.Data.SqlClient.SqlAuthenticationProvider (SqlAppAuthenticationProvider)
- Para Microsoft.Data.SqlClient, consulte Autenticação padrão do Active Directory. Esse modo de autenticação fornece uma funcionalidade semelhante em que DefaultAzureCredential é usado para obter o token de acesso para autenticação em instâncias SQL.
Use diretamente certificados no repositório de certificados como credencial do cliente (usando o nome da entidade ou o identificador de impressão digital)
Usar certificados diretamente no Key Vault como credencial do cliente (usando Key Vault identificador de segredo do certificado)
Alterar o provedor de autenticação com configuração de ambiente (ou seja, cadeias de conexão no AppAuthentication)
- Suporte limitado no Azure.Identity com DefaultAzureCredential e EnvironmentCredential, consulte variáveis de ambiente
Determinar o provedor de autenticação e a identidade usados para autenticação baseada em ambiente (ou seja, propriedade AzureServiceTokenProvider.PrincipalUsed)
- Pode determinar o provedor de autenticação usado com DefaultAzureCredential no Azure.Identity usando AzureEventSourceListener
Abaixo estão alguns exemplos de migração de um SDK de cliente do Azure mais antigo usando AppAuthentication para a versão mais recente do SDK do cliente do Azure usando o Azure.Identity. O código que usa o Azure.Identity é mais frequentemente do que não será muito mais simples e simples do que o código AppAuthentication
Microsoft.Azure.KeyVault para Azure.Security.KeyVault:
- Usando
AppAuthentication
a biblioteca
AzureServiceTokenProvider tokenProvider = new AzureServiceTokenProvider();
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(tokenProvider.KeyVaultTokenCallback));
var secretBundle = await client.GetSecretAsync("https://keyvaultname.vault.azure.net/secrets/secretname");
Console.WriteLine(secretBundle.Value);
- Usando
Azure.Identity
a biblioteca
var client = new SecretClient(new Uri("https://keyvaultname.vault.azure.net"), new DefaultAzureCredential());
var secret = client.GetSecret("secretName").Value;
Console.WriteLine(secret.Value);
Microsoft.Azure.Storage.Queues para Azure.Storage.Queues:
- Usando
AppAuthentication
a biblioteca
var tokenProvider = new AzureServiceTokenProvider();
var accessToken = await tokenProvider.GetAccessTokenAsync("https://storageaccountname.queue.core.windows.net");
var tokenCredential = new StorageTokenCredential(accessToken);
var storageCredentials = new StorageCredentials(tokenCredential);
var uri = new StorageUri(new Uri("https://storageaccountname.queue.core.windows.net"));
var client = new CloudQueueClient(uri, storageCredentials);
var queue = client.GetQueueReference("queuename");
queue.AddMessage(new CloudQueueMessage("Microsoft.Azure.Storage.Queues"));
- Usando
Azure.Identity
a biblioteca
QueueClient queueClient = new QueueClient(new Uri("https://storageaccountname.queue.core.windows.net/queuename"), new DefaultAzureCredential());
queueClient.SendMessage("Azure.Storage.Queues");
Recuperação de token de acesso
- Usando
AppAuthentication
a biblioteca
var tokenProvider = new AzureServiceTokenProvider();
var accessToken = await tokenProvider.GetAccessTokenAsync(ResourceId);
- Usando
Azure.Identity
a biblioteca
var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
new TokenRequestContext(scopes: new string[] { ResourceId + "/.default" }) { }
);
Observação
Mais informações sobre o .default
escopo podem ser encontradas aqui.
Azure SDK for .NET