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 AppAuthenticationque 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.