Freigeben über


Manuelles Abrufen von Microsoft Entra-ID-Token

Auf dieser Seite wird beschrieben, wie Sie Microsoft Entra ID-Zugriffstoken für Benutzer und Dienstprinzipale manuell generieren, um sich bei Azure Databricks-REST-APIs zu authentifizieren. Die manuelle Tokengenerierung ist eine erweiterte Technik.

Von Bedeutung

Databricks empfiehlt das manuelle Erstellen von Microsoft Entra ID-Token nicht. Sie laufen innerhalb einer Stunde ab und erfordern einen manuellen Ersatz. Verwenden Sie stattdessen Tools oder SDKs mit einheitlicher Authentifizierung , um die Tokenverwaltung automatisch zu verarbeiten.

Verwenden Sie verwaltete Dienstprinzipale von Azure Databricks für die meisten Anwendungsfälle. Verwenden Sie nur verwaltete Dienstprinzipale von Microsoft Entra ID, wenn Sie auf Azure-Ressourcen zugreifen müssen, da sie zusätzliche Microsoft Entra-ID-Berechtigungen benötigen.

Wann manuelle Tokengenerierung verwendet werden sollte

Verwenden Sie die manuelle Tokengenerierung nur, wenn:

  • Sie müssen in Systeme integriert werden, die keine Azure CLI oder einheitliche Authentifizierung verwenden können
  • Sie benötigen explizite Kontrolle über den Tokenlebenszyklus und die Aktualisierung
  • Sie führen eine Fehlersuche bei Authentifizierungsproblemen durch

Verwenden Sie für alle anderen Anwendungsfälle die empfohlenen Authentifizierungsmethoden, die die Tokenverwaltung automatisch verarbeiten.

Abrufen von Token für Benutzer

Verwenden Sie die Azure CLI oder die Microsoft Authentication Library (MSAL), um Microsoft Entra ID-Zugriffstoken für Benutzer abzurufen.

Azure CLI-Methode

  1. Rufen Sie die Azure-Abonnement-ID für Ihr Benutzerkonto ab:

    • Aus dem Azure Databricks-Arbeitsbereich: Klicken Sie auf Ihren Benutzernamen >Azure Portal>–Übersicht, und suchen Sie die Abonnement-ID.

    • Mit der Azure CLI: Führen Sie den folgenden Befehl aus (Arbeitsbereichs-URL ersetzen):

      az databricks workspace list --query "[?workspaceUrl==\`adb-0000000000000000.0.azuredatabricks.net\`].{id:id}" -o tsv
      
      # /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Databricks/workspaces/my-ws
      

      00000000-0000-0000-0000-000000000000 Danach /subscriptions/ ist Ihre Abonnement-ID angegeben.

      Wenn Sie einen Mandantenfehler erhalten, melden Sie sich beim richtigen Mandanten an:

      az login -t <tenant-id>
      

      Siehe Abrufen von Abonnement- und Mandanten-IDs im Azure-Portal.

  2. Melden Sie sich bei Azure an:

    az login
    
  3. Legen Sie das richtige Abonnement fest:

    az account set -s <subscription-id>
    
  4. Generieren Sie das Zugriffstoken:

    az account get-access-token \
    --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
    --query "accessToken" \
    -o tsv
    

    Die Ressourcen-ID ist der Standardbezeichner 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d für Azure Databricks in allen Azure-Umgebungen.

MSAL-Methode

Verwenden Sie die Microsoft Authentication Library (MSAL), um Microsoft Entra ID-Zugriffstoken programmgesteuert abzurufen. MSAL unterstützt zwei Flüsse:

  • Autorisierungscodefluss (interaktiv): Startet einen Browser für die Benutzeranmeldung. Verwenden Sie diese Option, wenn die zweistufige oder Verbundauthentifizierung aktiviert ist oder wenn die Administratorzustimmung erforderlich ist.
  • Benutzername-Kennwortfluss (programmgesteuert): Authentifiziert sich mit einem Benutzernamen und Kennwort. Verwenden Sie dies nur, wenn Sie über die Berechtigung verfügen, sich programmgesteuert anzumelden.

Bevor Sie MSAL verwenden, müssen Sie eine Anwendung in der Microsoft Entra-ID registrieren. Siehe Registrieren einer App mithilfe des Azure-Portals. Bei der Registrierung:

  1. Setzen Sie unterstützte Kontotypen auf Konten nur in diesem Organisationsverzeichnis (Einzelmandant) fest.
  2. Setzen Sie Redirect URI auf Öffentlicher Client/nativ (Mobil & Desktop) mit Wert .
  3. Notieren Sie sich die Anwendungs-ID (Client) und die Verzeichnis-ID (Mandanten) von der Übersicht-Seite der App.
  4. Fügen Sie die AzureDatabricks-API-Berechtigung hinzu:
    1. Wechseln Sie zu API-Berechtigungen>"Berechtigung hinzufügen".
    2. Suchen Sie nach AzureDatabricks, und wählen Sie sie aus.
    3. Aktivieren Sie user_impersonation , und klicken Sie auf "Berechtigungen hinzufügen".
    4. Klicken Sie auf " Administratorzustimmung erteilen" (erfordert Administratorrechte).

Autorisierungscodeflow

Installieren Sie das MSAL Python SDK:

pip install msal

Speichern Sie den folgenden Code als get-tokens.py:

from msal import PublicClientApplication
import sys

# Provide client ID and tenant ID as command-line arguments
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_interactive(scopes=scopes)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"Access token:\n{result['access_token']}")
  print(f"\nRefresh token:\n{result['refresh_token']}")

Führen Sie das Skript aus:

python get-tokens.py <client-id> <tenant-id>

Benutzername-Kennwortfluss

Speichern Sie den folgenden Code als get-tokens-user.py:

from msal import PublicClientApplication
import sys

client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
username = sys.argv[3] if len(sys.argv) > 1 else '<username>'
password = sys.argv[4] if len(sys.argv) > 1 else '<password>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_by_username_password(
  username=username,
  password=password,
  scopes=scopes
)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"Access token:\n{result['access_token']}")
  print(f"\nRefresh token:\n{result['refresh_token']}")

Führen Sie das Skript aus:

python get-tokens-user.py <client-id> <tenant-id> <username> <password>

Token für Dienstprinzipalobjekte abrufen

Dienstprinzipale verwenden den OAuth 2.0-Clientanmeldeinformationsfluss und können eine andere Zugriffssteuerung haben als normale Benutzer.

Erstellen eines Diensthauptkontos

Wenn Sie keinen Dienstprinzipal haben, erstellen Sie einen über das Azure-Portal oder die Azure CLI:

Azure-Portal

  1. Melden Sie sich beim Azure-Portal an.
  2. Falls erforderlich, wechseln Sie zum richtigen Mandanten über Verzeichnis + Abonnement.
  3. Suchen Sie nach Microsoft Entra ID, und wählen Sie es aus.
  4. Klicken Sie auf + Hinzufügen>App-Registrierung.
  5. Geben Sie einen Namen ein, und wählen Sie Konten nur in diesem Verzeichnis der Organisation (einzelner Mandant) aus.
  6. Klicken Sie auf Registrieren.
  7. Kopieren Sie diese Werte von der Übersichtsseite :
    • Anwendungs-ID (Client)
    • Verzeichnis-ID (Mandant)
  8. Wechseln Sie zu Zertifikate und Geheimnisse>Clientgeheimnisse>Neues Clientgeheimnis.
  9. Fügen Sie eine Beschreibung hinzu, legen Sie einen Ablaufzeitraum fest, und klicken Sie auf "Hinzufügen".
  10. Kopieren und sicher das Client-Geheimnis Wert aufbewahren.

Azure-Befehlszeilenschnittstelle (Azure CLI)

Ausführliche Anweisungen finden Sie unter Erstellen eines Azure-Dienstprinzipals mit Azure CLI .

Ein Token generieren

Generieren Sie ein Token mithilfe der REST-API oder der Azure CLI. Sammeln Sie zuerst die folgenden Informationen:

  • Mandanten-ID: Die Verzeichnis-ID (Mandant) aus der Microsoft Entra-ID
  • Client-ID: Die Anwendungs-ID (Client-ID) von Microsoft Entra ID
  • Client-Geheimnis: Der Client-Geheimniswert aus der Microsoft Entra-ID

REST-API-Methode

curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \
-d 'client_id=<client-id>' \
-d 'grant_type=client_credentials' \
-d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
-d 'client_secret=<client-secret>'

Das Zugriffstoken befindet sich im access_token Feld der Antwort.

Azure CLI-Methode

  1. Rufen Sie Ihre Azure-Abonnement-ID ab. Siehe Abrufen von Token für Benutzer.

  2. Melden Sie sich mit Ihrem Service Principal an:

    az login \
    --service-principal \
    -t <tenant-id> \
    -u <client-id> \
    -p <client-secret>
    
  3. Legen Sie das richtige Abonnement fest:

    az account set -s <subscription-id>
    
  4. Generieren Sie das Zugriffstoken:

    az account get-access-token \
    --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
    --query "accessToken" \
    -o tsv
    

Verwenden von Token mit Databricks-APIs

Verwenden Sie es nach dem Generieren eines Tokens mit der Databricks-REST-API.

Dienstprinzipale im Arbeitsbereich

Wenn Ihr Dienstprinzipal dem Arbeitsbereich bereits mithilfe der Dienstprinzipal-API oder Databricks CLI hinzugefügt wurde:

Databricks-Befehlszeilenschnittstelle

databricks clusters list -p <profile-name-with-token>

cURL

curl -X GET \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list

Dienstprinzipale mit Azure-Rolle

Wenn Ihr Dienstprinzipal auf der Arbeitsbereichsressource in Azure die Rolle Contributor oder Owner hat, sich aber noch nicht im Azure Databricks-Arbeitsbereich befindet:

  1. Abrufen eines Verwaltungstokens für den Azure Resource Manager:

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
    https://login.microsoftonline.com/<tenant-id>/oauth2/token \
    -d 'client_id=<client-id>' \
    -d 'grant_type=client_credentials' \
    -d 'resource=https%3A%2F%2Fmanagement.core.windows.net%2F' \
    -d 'client_secret=<client-secret>'
    
  2. Rufen Sie die Databricks-API mit beiden Token auf:

    curl -X GET \
    -H 'Authorization: Bearer <databricks-access-token>' \
    -H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \
    -H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Databricks/workspaces/<workspace-name>' \
    https://<databricks-instance>/api/2.0/clusters/list
    

Nach der ersten Authentifizierung wird der Dienstprinzipal ein Arbeitsbereichsadministrator.

Aktualisierungstoken

Wenn Sie ein Aktualisierungstoken mit Ihrem Zugriffstoken erhalten haben, verwenden Sie es, um ein neues Token abzurufen. Microsoft Entra ID-Zugriffstoken laufen standardmäßig nach 60-90 Minuten ab.

Speichern Sie den folgenden Code als refresh-tokens.py:

from msal import PublicClientApplication
import sys

client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
refresh_token = sys.argv[3] if len(sys.argv) > 1 else '<refresh-token>'

scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']

app = PublicClientApplication(
  client_id=client_id,
  authority=f"https://login.microsoftonline.com/{tenant_id}"
)

result = app.acquire_token_by_refresh_token(
  refresh_token=refresh_token,
  scopes=scopes
)

if 'error' in result:
  print(f"Error: {result['error']}")
  print(f"Description: {result['error_description']}")
else:
  print(f"\nNew access token:\n{result['access_token']}")
  print(f"\nNew refresh token:\n{result['refresh_token']}")

Führen Sie das Skript aus:

python refresh-tokens.py <client-id> <tenant-id> <refresh-token>

Behandeln von Tokenproblemen

In diesem Abschnitt werden allgemeine Tokenfehler und das Überprüfen von Zugriffstoken beschrieben.

Es ist nicht gelungen, das Token mit Benutzername und Kennwort abzurufen

The user or administrator has not consented to use the application with ID <client-id>.
Send an interactive authorization request for this user and resource.

Lösung: Stellen Sie sicher, dass die AzureDatabricks-Ressource Ihrer Anwendung hinzugefügt wird. Verwenden Sie den Autorisierungscodefluss (interaktive Methode), um Berechtigungen zuzustimmen. Nach der Zustimmung können Sie den Benutzernamen-Kennwortfluss verwenden. Siehe Abrufen von Token für Benutzer.

Umleitungs-URIs stimmen nicht überein

The reply URL specified in the request does not match the reply URLs configured for the application: '<application-id>'

Lösung: Überprüfen Sie, ob der Umleitungs-URI in Ihrer Anforderung einem in der Anwendung konfigurierten entspricht.

Überprüfen eines Zugriffstokens

Stellen Sie sicher, dass Ihr Microsoft Entra ID-Zugriffstoken die richtigen Informationen enthält. Siehe Überprüfen von Token.

  • aud: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d (Databricks-Ressourcen-ID)
  • iss: https://sts.windows.net/<tenant-id>/
  • tid: Mandanten-ID des Arbeitsbereichs
  • nbf/exp: Die aktuelle Zeit fällt zwischen diesen Werten.
  • unique_name: Der Benutzer ist im Arbeitsbereich vorhanden.

Überprüfen Sie die Signatur mithilfe von öffentlichen Zertifikaten von den OIDC-Endpunkten.

Decodieren ohne Signaturüberprüfung:

Der folgende Code zeigt die Nutzlast des Tokens. Sie müssen zuerst die PyJWT-Bibliothek verwenden pip install pyjwt und die Kryptografiebibliothek verwenden pip install cryptography.

import jwt

def decode_token(token):
  algorithm = jwt.get_unverified_header(token)['alg']
  decoded = jwt.decode(token, algorithms=[algorithm], options={"verify_signature": False})
  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

Decodieren mit Signaturüberprüfung:

import jwt
import requests
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend

PEMSTART = '-----BEGIN CERTIFICATE-----\n'
PEMEND = '\n-----END CERTIFICATE-----\n'

def get_public_key_for_token(kid):
  response = requests.get('https://login.microsoftonline.com/common/.well-known/openid-configuration').json()
  pubkeys = requests.get(response['jwks_uri']).json()['keys']

  for key in pubkeys:
    if key['kid'] == kid:
      cert_str = PEMSTART + str(key['x5c'][0]) + PEMEND
      cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
      return cert_obj.public_key()

def aad_access_token_decoder(access_token):
  header = jwt.get_unverified_header(access_token)
  public_key = get_public_key_for_token(header['kid'])
  decoded = jwt.decode(access_token, key=public_key, algorithms='RS256',
                      audience='2ff814a6-3304-4ab8-85cb-cd0e6f879c1d')
  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

Verwenden Sie Online-JWT-Decoder wie jwt.ms oder jwt.io für nicht vertrauliche Token.