Freigeben über


Problembehandlung für Microsoft Entra ID-Zugriffstoken

In diesem Artikel wird erläutert, wie Sie Fehler behandeln, die beim Abrufen von Microsoft Entra ID-Zugriffstoken auftreten können, und wie Zugriffstoken validiert werden.

Fehler beim Abrufen des Tokens mit Benutzername und Kennwort

Fehlermeldung

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

  1. Wenn die AzureDatabricks-Ressource in Ihrer Anwendung nicht vorhanden ist, bitten Sie einen Administratorbenutzer, sie hinzuzufügen.
  2. Verwenden Sie die interaktive Methode, um das Token abzurufen. Auf der Webseite erfahren Sie, wie Sie Berechtigungen für die Anwendung erteilen. Klicken Sie alternativ auf die Schaltfläche Berechtigungen erteilen, die in der Anwendungskonfiguration beschrieben wird. Nachdem Berechtigungen erteilt wurden, können Sie das Token programmgesteuert abrufen.

Nichtübereinstimmung von Umleitungs-URIs

Fehlermeldung

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 mit einem der Umleitungs-URIs in der Anwendung übereinstimmt.

Validieren eines Zugriffstokens

Wenn Sie über ein Microsoft Entra ID-Zugriffstoken verfügen, können Sie überprüfen, ob es die richtigen Informationen enthält (Validieren von Token).

Überprüfen Sie, ob die folgenden Felder mit dem Datensatz übereinstimmen:

  • aud: ID der Azure Databricks-Ressource: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: https://sts.windows.net/<tenant-id>/
  • tid: Mandant des Arbeitsbereichs (nach Organisations-ID oder Appliance-ID des Arbeitsbereichs überprüfen)
  • nbf/exp: aktuelle Zeit zwischen nbf und exp
  • unique_name: im Databricks-Arbeitsbereich vorhandener Benutzer sein, es sei denn, der Benutzer ist Mitwirkender in der Applianceressource des Arbeitsbereichs

Überprüfen Sie die Signatur des Tokens mithilfe der öffentlichen Zertifikate der OIDC-Endpunkte.

Der folgende Codeausschnitt zeigt die Nutzdaten des Tokens. Sie müssen zuerst die PyJWT-Bibliothek mit pip install pyjwt und die Kryptografiebibliothek mit pip install cryptography installieren:

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])}")

Wenn eine vollständige Decodierung (einschließlich Signaturüberprüfung) des Tokens erfolgen soll, können Sie den folgenden Codeschnipsel verwenden. Sie müssen zuerst die PyJWT-Bibliothek mit pip install pyjwt und die Kryptografiebibliothek mit pip install cryptography installieren. Stellen Sie außerdem sicher, dass Sie im folgenden Code <databricks-resource-id> ersetzen:

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'

# Get the Microsoft Azure public key.
def get_public_key_for_token(kid):
  response = requests.get(
    'https://login.microsoftonline.com/common/.well-known/openid-configuration',
  ).json()

  jwt_uri = response['jwks_uri']
  response_keys = requests.get(jwt_uri).json()
  pubkeys = response_keys['keys']

  public_key = ''

  for key in pubkeys:
    # Find the key that matches the kid in the token's header.
      if key['kid'] == kid:
        # Construct the public key object.
        mspubkey = str(key['x5c'][0])
        cert_str = PEMSTART + mspubkey + PEMEND
        cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
        public_key = cert_obj.public_key()

  return public_key

# Decode the given <ms-entra-id> token.
def aad_access_token_decoder(access_token):
  header = jwt.get_unverified_header(access_token)
  public_key = get_public_key_for_token(header['kid'])
  # The value of the databricks_resource_id is as defined previously,
  # for example, databricks_resource_id = "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d"
  decoded = jwt.decode(
    access_token,
    key = public_key,
    algorithms = 'RS256',
    audience = '<databricks-resource-id>')

  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

Hier sehen Sie ein Beispiel für die Ausgabe des obigen Codeausschnitts:

Einstellungen der in Azure registrierten App

Sie können decodierte Token auch über den JWT-Onlinedecoder anzeigen, wenn diese nicht vertraulich sind. Beispiele für Onlinedecoder sind jwt.ms und jwt.io.