Leitfaden zur Migration von AppAuthentication to Azure.Identity

Als die Microsoft.Azure.Services.AppAuthentication-Bibliothek im Herbst 2017 erstmals veröffentlicht wurde, wurde sie speziell entwickelt, um das häufige und systemische Problem der Anmeldeinformationen im Quellcode zu beheben. Es wurde ein neues Paradigma für die App-Entwicklung eingeführt, mit dem Entwickler einmal Code schreiben und die Clientbibliothek die Authentifizierung basierend auf der Anwendungsumgebung bestimmen kann AppAuthentication – ob auf einer Entwicklerarbeitsstation mit dem Konto eines Entwicklers oder mithilfe einer verwalteten Dienstidentität in Azure bereitgestellt. Entwickler könnten die direkte Verarbeitung von Anmeldeinformationen vollständig vermeiden, was sowohl die Entwicklung vereinfacht als auch die Sicherheit verbessert, indem sie verhindern, dass Anmeldeinformationen versehentlich im Quellcode offengelegt werden. Aufgrund seiner Einfachheit und Sicherheitsvorteile, AppAuthentication wurde von Entwicklern gut angenommen. NuGet erhielt über 160 Millionen Downloads und wurde in anderen Bibliotheken und Frameworks für Azure-Dienste verwendet, z. B. dem Azure Key Vault-Konfigurationsanbieter in .NET Core und dem Microsoft.Azure.ServiceBus SDK.

Die im Herbst 2019 veröffentlichte Azure.Identity-Clientbibliothek ist der spirituelle Nachfolger der AppAuthentication Bibliothek. Azure.Identity hat einen großen Vorteil AppAuthentication gegenüber seiner breiteren Verfügbarkeit in mehreren Sprachen, die einen konsistenten Entwurf und eine ähnliche Verwendung in diesen Sprachen bieten, während AppAuthentication es nur für .NET verfügbar war. Zusätzlich zur Unterstützung mehrerer Sprachen sind die verschiedenen Implementierungen der abstrakten TokenCredential-Klasse ein wichtiges Designfeature von Azure.Identity, von denen neuere Azure-Client-SDKs akzeptiert werden. Diese neueren Azure SDKs lassen sich leicht durch Paketnamen und Namespaces unterscheiden, die mit "Azure" beginnen, d. h. "Azure.Identity", "Azure.Storage.Blobs". Zur Authentifizierung wird der gewünschte Typ des TokenCredential-Objekts instanziiert und einfach direkt an die Azure SDK-Clientklasse übergeben. Dieser Entwurf bietet der Verwendung von Azure.Identity einen zusätzlichen Sicherheitsvorteil gegenüber der Verwendung von AppAuthentication und älteren SDKs, die das Zugriffstoken angeben müssen, da Zugriffstoken nicht direkt von der Anwendung selbst verarbeitet werden müssen. Dadurch wird das zusätzliche Risiko verringert, dass Zugriffstoken versehentlich über Ablaufverfolgungen, Protokolle und andere Quellen offengelegt werden.

Wenn Sie mit der Entwicklung einer neuen Anwendung beginnen, wird dringend empfohlen, die neuen Azure-Client-SDKs zu verwenden Azure.Identity . Wenn Sie über eine vorhandene Anwendung verfügen, die AppAuthentication verwendet und Azure.Identity verwenden möchten, besteht der bevorzugte Pfad darin, Ihre Anwendung so zu aktualisieren, dass sie die neuen Azure-Client-SDKs verwendet, die das Akzeptieren von TokenCredentials unterstützen. AppAuthentication gilt nun als veraltet, und es wird keine weiteren Investitionen in die Entwicklung geben. Die Verwendung von DefaultAzureCredential in Azure.Identity bietet ähnliche Funktionen wie AzureServiceTokenProvider in AppAuthentication, wobei sich der verwendete Authentifizierungsanbieter basierend auf der aktuellen Umgebung ändert. Wenn Sie eine AppAuthentication Verbindungszeichenfolge für einen bestimmten Authentifizierungsanbieter verwenden AppAuthentication, sehen Sie sich die folgende Tabelle an, um zu erfahren, wie Sie denselben Authentifizierungsanbieter verwenden, indem Sie die entsprechenden TokenCredential in Azure.Identity erstellen.

Authentifizierungsanbieter AppAuthentication
Verbindungszeichenfolge
Azure.Identity
TokenCredential
Umgebungsbasiert (Standard) Standard : keine Verbindungszeichenfolge verwendet new DefaultAzureCredential()*
Azure CLI RunAs=Developer;
DeveloperTool=AzureCli
new AzureCliCredential()
Visual Studio RunAs=Developer; DeveloperTool=VisualStudio new VisualStudioCredential()
Integrierte Windows-Authentifizierung RunAs=CurrentUser Keine Unterstützung
Systemseitig zugewiesene verwaltete Identität RunAs=App new ManagedIdentityCredential()
Benutzerseitig zugewiesene verwaltete Identität RunAs=App; AppId=appId new ManagedIdentityCredential(appId)
Dienstprinzipalclientzertifikat RunAs=App; AppId=appId;
KeyVaultCertificateSecretIdentifier=kvIdentifier
Keine Unterstützung
Dienstprinzipalclientzertifikat RunAs=App; AppId=appId; TenantId=tenantId;
CertificateThumbprint=fingerabdruck;
CertificateStoreLocation=location
new EnvironmentCredential()**
new ClientCertificateCredential(tenantId, appId, certObjOrFilePath)
Dienstprinzipalclientzertifikat RunAs=App; AppId=appId; TenantId=tenantId;
CertificateSubjectName=subject;
CertificateStoreLocation=location
new EnvironmentCredential()**
new ClientCertificateCredential(tenantId, appId, certObjOrFilePath)
Dienstprinzipal-Clientgeheimnis RunAs=App; AppId=appId; TenantId=tenantId;
AppKey=secret
new EnvironmentCredential()**
new ClientSecretCredential(tenantId, appId, secret)

Hinweis

* Authentifizierungsanbieter und Reihenfolge unterscheiden sich zwischen AzureServiceTokenProvider und DefaultAzureCredential
** Festlegen von Umgebungsvariablen

Während Azure.Identity die meisten Authentifizierungsszenarien und Anbieter unterstützt, die AppAuthentication hat, gibt es einige Szenarien und Features, die derzeit nicht unterstützt werden:

  • Integrierter Windows-Authentifizierungsanbieter

  • System.Data.SqlClient.SqlAuthenticationProvider-Implementierung (SqlAppAuthenticationProvider)

    • Informationen zu Microsoft.Data.SqlClient finden Sie unter Active Directory-Standardauthentifizierung. Dieser Authentifizierungsmodus bietet ähnliche Funktionen, bei denen DefaultAzureCredential zum Abrufen des Zugriffstokens für die Authentifizierung bei SQL-Instanzen verwendet wird.
  • Direkte Verwendung von Zertifikaten im Zertifikatspeicher als Clientanmeldeinformationen (unter Verwendung des Antragstellernamens oder Fingerabdruckbezeichners)

  • Direkte Verwendung von Zertifikaten in Key Vault als Clientanmeldeinformationen (mithilfe Key Vault Zertifikatgeheimnisbezeichners)

  • Ändern des Authentifizierungsanbieters mit Umgebungskonfiguration (d. h. Verbindungszeichenfolgen in AppAuthentication)

    • Eingeschränkte Unterstützung in Azure.Identity mit DefaultAzureCredential und EnvironmentCredential, siehe Umgebungsvariablen
  • Ermitteln des Authentifizierungsanbieters und der Identität, die für die umgebungsbasierte Authentifizierung verwendet werden (d. h. AzureServiceTokenProvider.PrincipalUsed-Eigenschaft)

    • Kann den mit DefaultAzureCredential in Azure.Identity verwendeten Authentifizierungsanbieter mithilfe von AzureEventSourceListener ermitteln

Im Folgenden finden Sie einige Beispiele für die Migration von einem älteren Azure-Client-SDK mithilfe von AppAuthentication zu der neueren Version des Azure-Client-SDK mithilfe von Azure.Identity. Der Code, der Azure.Identity verwendet, ist in den meisten Fällen viel einfacher und einfacher als der AppAuthentication-Code.

Microsoft.Azure.KeyVault zu Azure.Security.KeyVault:

  • Verwenden der AppAuthentication Bibliothek
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);
  • Verwenden der Azure.Identity Bibliothek
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 to Azure.Storage.Queues:

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

Abrufen von Zugriffstoken

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

Hinweis

Weitere Informationen zum .default Umfang finden Sie hier.