Share via


Guía de migración de AppAuthentication a Azure.Identity

Cuando la biblioteca Microsoft.Azure.Services.AppAuthentication se publicó por primera vez en otoño de 2017, se diseñó específicamente para ayudar a mitigar el problema común y sistémico de las credenciales en el código fuente. Introdujo un nuevo paradigma para el desarrollo de aplicaciones que permitía a los desarrolladores escribir código una vez y dejar que AppAuthentication la biblioteca cliente determinara cómo autenticarse en función del entorno de la aplicación, ya sea en una estación de trabajo para desarrolladores mediante una cuenta de desarrollador o implementada en Azure mediante una identidad de servicio administrada. Los desarrolladores podrían evitar controlar completamente las credenciales, lo que simplifica el desarrollo y mejora la seguridad al impedir que las credenciales se revelen accidentalmente en el código fuente. Dada su simplicidad y ventajas de seguridad, AppAuthentication los desarrolladores han recibido muy bien. NuGet recibió más de 160 millones de descargas y se usó en otras bibliotecas y marcos para servicios de Azure, como el proveedor de configuración de Azure Key Vault en .NET Core y el SDK de Microsoft.Azure.ServiceBus.

Publicada en otoño de 2019, la biblioteca cliente de Azure.Identity es la sucesora espiritual de la AppAuthentication biblioteca. Azure.Identity tiene una ventaja importante con AppAuthentication respecto a su disponibilidad más amplia en varios lenguajes que proporcionan un diseño coherente y un uso similar en estos lenguajes, mientras AppAuthentication que solo estaba disponible para .NET. Además de su compatibilidad con varios lenguajes, una característica de diseño clave de Azure.Identity es sus diversas implementaciones de la clase Abstract TokenCredential, de la que aceptan los SDK de cliente de Azure más recientes. Estos SDK de Azure más recientes se distinguen fácilmente por nombres de paquete y espacios de nombres que comienzan por "Azure", es decir, "Azure.Identity", "Azure.Storage.Blobs". Para autenticarse, se crea una instancia del tipo deseado de objeto TokenCredential y simplemente se pasa directamente a la clase de cliente del SDK de Azure. Este diseño proporciona a Azure.Identity una ventaja de seguridad adicional sobre el uso de AppAuthentication y sdk anteriores que requieren especificar el token de acceso porque los tokens de acceso no necesitan ser administrados directamente por la propia aplicación. Esto mitiga el riesgo adicional de que los tokens de acceso se revelen accidentalmente a través de seguimientos, registros y otros orígenes.

Si va a iniciar el desarrollo de una nueva aplicación, se recomienda encarecidamente usar Azure.Identity y los nuevos SDK de cliente de Azure. Si tiene una aplicación existente que usa AppAuthentication y quiere usar Azure.Identity, la ruta de acceso preferida es actualizar la aplicación para usar los nuevos SDK de cliente de Azure que admiten la aceptación de TokenCredentials. AppAuthentication ahora se considera en desuso y no habrá ninguna inversión adicional en su desarrollo. El uso de DefaultAzureCredential in Azure.Identity proporcionará una funcionalidad similar a AzureServiceTokenProvider en AppAuthentication, donde el proveedor de autenticación usado cambiará en función del entorno actual. Si usa una AppAuthentication cadena de conexión para un proveedor de autenticación específico mediante AppAuthentication, consulte la tabla siguiente para ver cómo usar el mismo proveedor de autenticación mediante la creación del tokenCredential adecuado en Azure.Identity.

Proveedor de autenticación AppAuthentication
Cadena de conexión
Azure.Identity
TokenCredential
(Valor predeterminado) basado en el entorno Valor predeterminado: no se usa ninguna cadena de conexión new DefaultAzureCredential()*
CLI de Azure RunAs=Developer;
DeveloperTool=AzureCli
new AzureCliCredential()
Visual Studio RunAs=Developer; DeveloperTool=VisualStudio nuevo VisualStudioCredential()
Autenticación integrada de Windows RunAs=CurrentUser No se admite
Identidad administrada asignada por el sistema RunAs=App new ManagedIdentityCredential()
Identidad administrada asignada por el usuario RunAs=App; AppId=appId new ManagedIdentityCredential(appId)
Certificado de cliente de entidad de servicio RunAs=App; AppId=appId;
KeyVaultCertificateSecretIdentifier=kvIdentifier
No se admite
Certificado de cliente de entidad de servicio RunAs=App; AppId=appId; TenantId=tenantId;
CertificateThumbprint=thumbprint;
CertificateStoreLocation=location
new EnvironmentCredential()**
new ClientCertificateCredential(tenantId, appId, certObjOrFilePath)
Certificado de cliente de entidad de servicio RunAs=App; AppId=appId; TenantId=tenantId;
CertificateSubjectName=subject;
CertificateStoreLocation=location
new EnvironmentCredential()**
new ClientCertificateCredential(tenantId, appId, certObjOrFilePath)
Secreto de cliente de la entidad de servicio RunAs=App; AppId=appId; TenantId=tenantId;
AppKey=secret
new EnvironmentCredential()**
new ClientSecretCredential(tenantId, appId, secret)

Nota

* Los proveedores de autenticación y el orden son diferentes entre AzureServiceTokenProvider y DefaultAzureCredential
** Necesidad de establecer variables de entorno

Aunque Azure.Identity admite la mayoría de los escenarios y proveedores de autenticación que tiene AppAuthentication, hay algunos escenarios y características que actualmente no se admiten:

  • Proveedor de autenticación integrado de Windows

  • Implementación de System.Data.SqlClient.SqlAuthenticationProvider (SqlAppAuthenticationProvider)

    • Para Microsoft.Data.SqlClient, consulte Autenticación predeterminada de Active Directory. Este modo de autenticación proporciona una funcionalidad similar en la que se usa DefaultAzureCredential para obtener el token de acceso para la autenticación en instancias de SQL.
  • Usar directamente certificados en el almacén de certificados como credencial de cliente (mediante el nombre del firmante o el identificador de huella digital)

  • Usar directamente certificados en Key Vault como credencial de cliente (mediante Key Vault identificador de secreto de certificado)

  • Cambio del proveedor de autenticación con la configuración del entorno (es decir, cadenas de conexión en AppAuthentication)

    • Compatibilidad limitada en Azure.Identity con DefaultAzureCredential y EnvironmentCredential, consulte Variables de entorno.
  • Determine el proveedor de autenticación y la identidad usados para la autenticación basada en el entorno (es decir, la propiedad AzureServiceTokenProvider.PrincipalUsed)

    • Puede determinar el proveedor de autenticación que se usa con DefaultAzureCredential en Azure.Identity mediante AzureEventSourceListener.

A continuación se muestran algunos ejemplos de migración desde un SDK de cliente de Azure anterior mediante AppAuthentication a la versión más reciente del SDK de cliente de Azure mediante Azure.Identity. El código que usa Azure.Identity suele ser mucho más sencillo y sencillo que el código de AppAuthentication

Microsoft.Azure.KeyVault a Azure.Security.KeyVault:

  • Uso de AppAuthentication la 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);
  • Uso de Azure.Identity la 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 a Azure.Storage.Queues:

  • Uso de AppAuthentication la 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"));
  • Uso de Azure.Identity la biblioteca
QueueClient queueClient = new QueueClient(new Uri("https://storageaccountname.queue.core.windows.net/queuename"), new DefaultAzureCredential());
queueClient.SendMessage("Azure.Storage.Queues");

Recuperación de tokens de acceso

  • Uso de AppAuthentication la biblioteca
var tokenProvider = new AzureServiceTokenProvider();
var accessToken = await tokenProvider.GetAccessTokenAsync(ResourceId);
  • Uso de Azure.Identity la biblioteca
var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
    new TokenRequestContext(scopes: new string[] { ResourceId + "/.default" }) { }
);

Nota

Puede encontrar más información sobre el .default ámbito aquí.