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.
Azure SDK for .NET