Teilen über


Anmeldeinformationsketten in der Azure Identity-Bibliothek für Java

Die Azure Identity-Bibliothek stellt Anmeldeinformationen bereit – öffentliche Klassen, die die TokenCredential-Schnittstelle der Azure Core-Bibliothek implementieren. Ein Berechtigungsnachweis stellt einen eindeutigen Authentifizierungsfluss zum Abrufen eines Zugriffstokens aus Microsoft Entra ID dar. Diese Anmeldedaten können miteinander verkettet werden, um eine geordnete Abfolge von Authentifizierungsmechanismen zu bilden, die versucht werden sollen.

Funktionsweise von verketteten Anmeldeinformationen

Zur Laufzeit versucht eine Anmeldeinformationskette, sich mit den ersten Anmeldeinformationen der Sequenz zu authentifizieren. Wenn diese Anmeldeinformationen kein Zugriffstoken abrufen, werden die nächsten Anmeldeinformationen in der Sequenz ausprobiert usw., bis erfolgreich ein Zugriffstoken abgerufen wurde. Das unten stehende Diagramm veranschaulicht dieses Verhalten:

Diagramm, das die Sequenz der Anmeldeinformationskette zeigt.

Gründe für die Verwendung von Anmeldeinformationsketten

Verkettete Anmeldeinformationen können die folgenden Vorteile bieten:

  • Umgebungsbewusstsein: Wählt automatisch die am besten geeigneten Anmeldeinformationen basierend auf der Umgebung aus, in der die App ausgeführt wird. Ohne sie müssten Sie Code wie diesen schreiben:

    import com.azure.core.credential.TokenCredential;
    import com.azure.identity.AzureCliCredentialBuilder;
    import com.azure.identity.ManagedIdentityCredentialBuilder;
    
    // Code omitted for brevity
    
    TokenCredential credential = null;
    
    // Set up credential based on environment (Azure or local development)
    String environment = System.getenv("ENV");
    
    if (environment != null && environment.equals("production")) {
        credential = new ManagedIdentityCredentialBuilder()
            .clientId(userAssignedClientId)
            .build();
    } else {
        credential = new AzureCliCredentialBuilder()
            .build();
    }
    
  • Nahtlose Übergänge: Ihre App kann von der lokalen Entwicklung zur Staging- oder Produktionsumgebung wechseln, ohne den Authentifizierungscode zu ändern.

  • Verbesserte Resilienz: Enthält einen Fallbackmechanismus, der zu den nächsten Anmeldeinformationen wechselt, wenn der vorherige Fehler beim Abrufen eines Zugriffstokens auftritt.

So wählen Sie ein verkettetes Kredential

Es gibt zwei unterschiedliche Philosophien für die Verkettung von Anmeldeinformationen:

  • Verwenden Sie eine vorkonfigurierte Kette: Beginnen Sie mit einer Meinungskette, die die am häufigsten verwendeten Authentifizierungsszenarien berücksichtigt. Informationen zu diesem Ansatz finden Sie im Abschnitt "DefaultAzureCredential overview ".
  • "Erstellen" einer Kette: Beginnen Sie mit einer leeren Kette und schließen Sie nur das ein, was Sie benötigen. Informationen zu diesem Ansatz finden Sie im Abschnitt "ChainedTokenCredential" (Übersicht ).

Übersicht über DefaultAzureCredential

DefaultAzureCredential ist eine vorgabebasierte, vorkonfigurierte Kette von Anmeldeinformationen. Er wurde entwickelt, um viele Umgebungen zusammen mit den am häufigsten verwendeten Authentifizierungsflüssen und Entwicklertools zu unterstützen. In grafischer Form sieht die zugrunde liegende Kette wie folgt aus:

Diagramm, das den DefaultAzureCredential-Authentifizierungsfluss zeigt.

Die Reihenfolge, in der DefaultAzureCredential, versucht, Anmeldeinformationen zu erhalten, folgt.

Bestellung Berechtigung Beschreibung
1 Umwelt Liest eine Auflistung von Umgebungsvariablen , um festzustellen, ob ein Anwendungsdienstprinzipal (Anwendungsbenutzer) für die App konfiguriert ist. Wenn ja, verwendet DefaultAzureCredential diese Werte, um die App bei Azure zu authentifizieren. Diese Methode wird am häufigsten in Serverumgebungen verwendet, kann aber auch bei der lokalen Entwicklung verwendet werden.
2 Workload-Identität Wenn die App auf einem Azure-Host mit aktivierter Workloadidentität bereitgestellt wird, authentifizieren Sie dieses Konto.
3 Verwaltete Identität Wenn die App auf einem Azure-Host bereitgestellt wird, während die Funktion „Verwaltete Identität“ aktiviert ist, wird die App bei Azure mit dieser verwalteten Identität authentifiziert.
4 IntelliJ Wenn sich der Entwickler über das Azure-Toolkit für IntelliJ authentifiziert hat, authentifizieren Sie dieses Konto.
5 Visual Studio Code Wenn der Entwickler über die Azure Resources-Erweiterung von Visual Studio Code authentifiziert und das Azure Identity-Broker-Paket installiert ist, authentifizieren Sie dieses Konto.
6 Azure CLI Wenn sich der Entwickler mit dem az login-Befehl der Azure CLI bei Azure authentifiziert hat, authentifizieren Sie die App mit demselben Konto bei Azure.
7 Azure PowerShell Wenn sich der Entwickler mit dem Connect-AzAccount-Cmdlet von Azure PowerShell bei Azure authentifiziert hat, authentifizieren Sie die App mit demselben Konto bei Azure.
8 Azure Developer CLI Wenn sich der Entwickler mit dem azd auth login-Befehl der Azure Developer CLI bei Azure authentifiziert hat, authentifizieren Sie sich mit diesem Konto.
9 Broker- Authentifiziert sich mithilfe des Standardkontos, das über einen Broker beim Betriebssystem angemeldet ist. Erfordert, dass das Azure-Identity-Broker-Paket installiert ist, da eine brokerfähige Instanz InteractiveBrowserCredential verwendet wird.

In der einfachsten Form können Sie die parameterlose Version von DefaultAzureCredential wie folgt verwenden:

import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;

// Code omitted for brevity

DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
    .build();

So passen Sie DefaultAzureCredential an

In den folgenden Abschnitten werden Strategien zum Steuern beschrieben, welche Anmeldeinformationen in der Kette enthalten sind.

Ausschließen einer Kategorie des Anmeldeinformationstyps

Um alle Developer tool oder Deployed service Anmeldeinformationen auszuschließen, setzen Sie die Umgebungsvariable AZURE_TOKEN_CREDENTIALS auf prod bzw. dev. Wenn ein Wert prod verwendet wird, sieht die zugrunde liegende Anmeldeinformationskette wie folgt aus:

Diagramm, das DefaultAzureCredential zeigt, wobei AZURE_TOKEN_CREDENTIALS auf "prod" festgelegt sind.

Wenn ein Wert dev verwendet wird, sieht die Kette wie folgt aus:

Diagramm, das zeigt, dass DefaultAzureCredential mit AZURE_TOKEN_CREDENTIALS auf "dev" gesetzt ist.

Von Bedeutung

Die AZURE_TOKEN_CREDENTIALS Umgebungsvariable wird in azure-identity Paketversionen 1.16.1 und höher unterstützt.

Um sicherzustellen, dass die Umgebungsvariable definiert und auf eine unterstützte Zeichenfolge festgelegt wird, rufen Sie die Methode requireEnvVars wie folgt auf:

DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
    .build();

Verwenden einer bestimmten Anmeldeinformation

Um alle Anmeldeinformationen außer einem auszuschließen, legen Sie die Umgebungsvariable AZURE_TOKEN_CREDENTIALS auf den Anmeldeinformationsnamen fest. Sie können beispielsweise die DefaultAzureCredential Kette AzureCliCredential reduzieren, indem Sie auf ".AZURE_TOKEN_CREDENTIALSAzureCliCredential Der Zeichenfolgenvergleich wird ohne Groß-/Kleinschreibung durchgeführt. Gültige Zeichenfolgenwerte für die Umgebungsvariable sind:

  • AzureCliCredential
  • AzureDeveloperCliCredential
  • AzurePowerShellCredential
  • EnvironmentCredential
  • IntelliJCredential
  • ManagedIdentityCredential
  • VisualStudioCodeCredential
  • WorkloadIdentityCredential

Von Bedeutung

Die AZURE_TOKEN_CREDENTIALS Umgebungsvariable unterstützt einzelne Anmeldeinformationsnamen in azure-identity Paketversionen 1.17.0 und höher.

Um sicherzustellen, dass die Umgebungsvariable definiert und auf eine unterstützte Zeichenfolge festgelegt wird, rufen Sie die Methode requireEnvVars wie folgt auf:

DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
    .build();

Übersicht über ChainedTokenCredential

ChainedTokenCredential ist eine leere Verknüpfung, der Sie Anmeldedaten hinzufügen, die zu den Anforderungen Ihrer App passen. Zum Beispiel:

import com.azure.identity.AzureCliCredential;
import com.azure.identity.AzureCliCredentialBuilder;
import com.azure.identity.ChainedTokenCredential;
import com.azure.identity.ChainedTokenCredentialBuilder;
import com.azure.identity.IntelliJCredential;
import com.azure.identity.IntelliJCredentialBuilder;

// Code omitted for brevity

AzureCliCredential cliCredential = new AzureCliCredentialBuilder()
    .build();
IntelliJCredential ijCredential = new IntelliJCredentialBuilder()
    .build();

ChainedTokenCredential credential = new ChainedTokenCredentialBuilder()
    .addLast(cliCredential)
    .addLast(ijCredential)
    .build();

Im vorherigen Codebeispiel wird eine maßgeschneiderte Anmeldeinformationskette erstellt, die aus zwei Anmeldeinformationen zur Entwicklungszeit besteht. AzureCliCredential wird zuerst versucht, gefolgt von IntelliJCredential, falls erforderlich. In grafischer Form sieht die Kette wie folgt aus:

Diagramm, das den Authentifizierungsfluss für eine ChainedTokenCredential-Instanz zeigt, die aus den Azure CLI- und IntelliJ-Anmeldeinformationen besteht.

Tipp

Um die Leistung zu verbessern, optimieren Sie die Sortierung von Anmeldeinformationen in ChainedTokenCredential von den meisten bis zu den am wenigsten verwendeten Anmeldeinformationen.

Verwendungsleitfaden für DefaultAzureCredential

DefaultAzureCredential ist zweifellos die einfachste Möglichkeit, mit der Azure Identity-Bibliothek zu beginnen, aber mit diesem Komfort kommt es zu Kompromissen. Nachdem Sie Ihre App in Azure bereitgestellt haben, sollten Sie die Authentifizierungsanforderungen der App verstehen. Ersetzen Sie aus diesem Grund DefaultAzureCredential durch eine bestimmte TokenCredential Implementierung, z. B. ManagedIdentityCredential.

Dies ist der Grund:

  • Debugging-Herausforderungen: Wenn die Authentifizierung fehlschlägt, kann es schwierig sein, die beleidigenden Anmeldeinformationen zu debuggen und zu identifizieren. Sie müssen die Protokollierung aktivieren, um den Fortschritt von einer Anmeldeinformation zum nächsten sowie den Status „Erfolg/Fehler“ der einzelnen Anmeldeinformationen anzuzeigen. Weitere Informationen finden Sie unter Debuggen einer verketteten Anmeldeinformationen.
  • Leistungsaufwand: Der Prozess des sequenziellen Ausprobierens mehrerer Anmeldeinformationen kann leistungseinbußen verursachen. Wenn sie beispielsweise auf einem lokalen Entwicklungscomputer ausgeführt wird, ist die verwaltete Identität nicht verfügbar. Folglich schlägt ManagedIdentityCredential in der lokalen Entwicklungsumgebung immer fehl.
  • Unvorhersehbares Verhalten: DefaultAzureCredential Sucht nach dem Vorhandensein bestimmter Umgebungsvariablen. Es ist möglich, dass jemand diese Umgebungsvariablen auf der Systemebene auf dem Hostcomputer hinzufügen oder ändern kann. Diese Änderungen gelten global und ändern daher das Verhalten von DefaultAzureCredential zur Laufzeit in jeder App, die auf diesem Computer ausgeführt wird.

Debuggen von verketteten Anmeldeinformationen

Um ein unerwartetes Problem zu diagnostizieren oder zu verstehen, was eine verkettete Anmeldeinformation tut, aktivieren Sie die Anmeldung in Ihrer App.

Nehmen Sie zur Veranschaulichung an, dass die parameterlose Form von DefaultAzureCredential verwendet wird, um eine Anforderung an ein Blob Storage-Konto zu authentifizieren. Die App wird in der lokalen Entwicklungsumgebung ausgeführt und der Entwickler bei Azure mithilfe der Azure CLI authentifiziert. Wenn die App ausgeführt wird, werden die folgenden relevanten Einträge in der Ausgabe angezeigt:

[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential EnvironmentCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential WorkloadIdentityCredential is unavailable.
[ForkJoinPool.commonPool-worker-1] WARN com.microsoft.aad.msal4j.ConfidentialClientApplication - [Correlation ID: aaaa0000-bb11-2222-33cc-444444dddddd] Execution of class com.microsoft.aad.msal4j.AcquireTokenByClientCredentialSupplier failed: java.util.concurrent.ExecutionException: com.azure.identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential ManagedIdentityCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential IntelliJCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential VisualStudioCodeCredential is unavailable.
[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential AzureCliCredential returns a token

In der vorangegangenen Ausgabe beachten Sie, dass:

  • EnvironmentCredential, WorkloadIdentityCredential, ManagedIdentityCredential, IntelliJCredential und VisualStudioCodeCredential scheiterten nacheinander beim Abrufen eines Microsoft Entra-Zugriffstokens.
  • Der Aufruf von AzureCliCredential.getToken ist erfolgreich, wie durch den Eintrag mit dem Suffix returns a token angegeben. Da AzureCliCredential erfolgreich war, wurden keine Anmeldeinformationen darüber hinaus versucht.