Azure-Workloads authentifizieren sich bei der Claude API, indem sie ein von Microsoft Entra ID ausgestelltes „JSON Web Token" (JSON-Web-Token), oder JWT, vorlegen und es dann gegen ein kurzlebiges Anthropic-Zugriffstoken eintauschen. Es gibt zwei gängige Wege, das von Entra ausgestellte Token zu erhalten:
http://169.254.169.254/metadata/identity/oauth2/token auf und erhält ein JWT für seine zugewiesene Identität.AZURE_FEDERATED_TOKEN_FILE. Der Workload tauscht dieses Token bei Entra gegen ein von Entra ausgestelltes Zugriffstoken ein.In beiden Fällen enthält das von Entra ausgestellte Token, das du Anthropic vorlegst, einen mandantenspezifischen Entra-Issuer (der Schritt Anthropic konfigurieren unten zeigt die genaue URL, die du registrieren musst) und die Objekt-ID der Managed Identity in den Claims sub und oid. Du registrierst diesen Issuer einmalig bei Anthropic, schreibst eine Föderationsregel, die mit den erwarteten Claims übereinstimmt, und dein Workload tauscht sein Entra-Token zur Laufzeit gegen ein sk-ant-oat01-...-Zugriffstoken ein.
AKS-Pods können alternativ den Entra-Austausch überspringen und das von Kubernetes projizierte Service-Account-Token direkt an Anthropic übergeben. Bei diesem Weg wird der OIDC-Issuer deines AKS-Clusters anstelle deines Entra-Mandanten bei Anthropic registriert. Siehe Kubernetes für diesen Ablauf.
Richte die Identität ein, für die Azure Tokens ausstellen wird. Wähle den Weg, der zu dem Ort passt, an dem dein Workload läuft.
Ein von Entra ausgestelltes Token für eine Managed Identity enthält diese Claims:
{
"iss": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"sub": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"aud": "https://api.anthropic.com",
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>",
"azp": "<CLIENT_ID>",
"exp": 1775527120
}sub und oid sind identisch (die Objekt-ID der Managed Identity). azp ist die Anwendungs- oder Client-ID. Gleiche auf oid ab, um eine bestimmte Identität zu autorisieren, oder auf azp, um jede Identität zu autorisieren, die mit einer Anwendungsregistrierung verknüpft ist. Der tid-Claim wiederholt deine Mandanten-ID; darauf abzugleichen ist eine zusätzliche Absicherung (Defense in Depth), da die Issuer-URL den Mandanten bereits festlegt.
Folge der Einrichtungsanleitung, um einen Föderations-Issuer zu registrieren, einen Anthropic-Service-Account zu erstellen und eine Föderationsregel in der Claude Console anzulegen. Wähle in der Console die Provider-Option OIDC und gib die folgenden Entra-spezifischen Werte an.
Föderations-Issuer: Entra veröffentlicht ein OIDC-Discovery-Dokument unter der mandantenspezifischen Issuer-URL, verwende also den Discovery-Modus. Jeder Azure-Mandant, den du föderierst, benötigt einen eigenen Issuer-Eintrag.
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks_source": "discovery"
}Je nach Token-Version kann der iss-Claim stattdessen https://sts.windows.net/<TENANT_ID>/ lauten. Dekodiere dein Managed-Identity-Token (der Abschnitt „Verifizieren" unten zeigt wie) und registriere den iss-Wert, den es enthält. Die beiden URLs teilen sich dasselbe JWKS, sodass der Discovery-Modus für beide funktioniert.
Föderationsregel: Gleiche auf die Objekt-ID der Managed Identity und deine Mandanten-ID ab.
{
"name": "azure-inference-worker",
"issuer_id": "fdis_...",
"match": {
"audience": "https://api.anthropic.com",
"claims": {
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>"
}
},
"target": {
"type": "service_account",
"service_account_id": "svac_..."
},
"workspace_id": "wrkspc_...",
"oauth_scope": "workspace:developer",
"token_lifetime_seconds": 600
}Zur Laufzeit ruft dein Workload sein Entra-Token ab, tauscht es bei POST /v1/oauth/token ein und verwendet das zurückgegebene Bearer-Token, um Claude aufzurufen. Jedes Anthropic-SDK übernimmt den Austausch und die Refresh-Schleife, wenn du ein Token-Provider-Callable bereitstellst, wie in den folgenden Beispielen gezeigt. Der cURL-Tab zeigt den rohen Ablauf.
import os
import anthropic
import requests
from anthropic import WorkloadIdentityCredentials
IMDS_URL = "http://169.254.169.254/metadata/identity/oauth2/token"
def fetch_entra_token() -> str:
"""Fetch a managed identity token from Azure IMDS."""
response = requests.get(
IMDS_URL,
headers={"Metadata": "true"},
params={"api-version": "2018-02-01", "resource": "https://api.anthropic.com"},
timeout=5,
)
response.raise_for_status()
return response.json()["access_token"]
client = anthropic.Anthropic(
credentials=WorkloadIdentityCredentials(
identity_token_provider=fetch_entra_token,
federation_rule_id=os.environ["ANTHROPIC_FEDERATION_RULE_ID"],
organization_id=os.environ["ANTHROPIC_ORGANIZATION_ID"],
service_account_id=os.environ["ANTHROPIC_SERVICE_ACCOUNT_ID"],
workspace_id=os.environ.get("ANTHROPIC_WORKSPACE_ID"),
),
)
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(message.content[0].text)Auf AKS ist die Datei unter AZURE_FEDERATED_TOKEN_FILE ein von Kubernetes projiziertes Service-Account-Token, das vom OIDC-Issuer deines Clusters signiert wurde, kein von Entra ausgestelltes Token. Um auf dem auf dieser Seite beschriebenen Entra-vermittelten Weg zu bleiben, tausche dieses Token zuerst bei https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token (föderierter client_credentials-Grant) ein und übergib dann das resultierende Entra-Zugriffstoken als Identitätstoken an das Anthropic-SDK.
import os
from pathlib import Path
import httpx
import anthropic
from anthropic import WorkloadIdentityCredentials
def fetch_entra_token_via_federation() -> str:
federated_token = Path(os.environ["AZURE_FEDERATED_TOKEN_FILE"]).read_text()
response = httpx.post(
f"https://login.microsoftonline.com/{os.environ['AZURE_TENANT_ID']}/oauth2/v2.0/token",
data={
"client_id": os.environ["AZURE_CLIENT_ID"],
"grant_type": "client_credentials",
"scope": "https://api.anthropic.com/.default",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": federated_token,
},
)
response.raise_for_status()
return response.json()["access_token"]
client = anthropic.Anthropic(
credentials=WorkloadIdentityCredentials(
identity_token_provider=fetch_entra_token_via_federation,
federation_rule_id=os.environ["ANTHROPIC_FEDERATION_RULE_ID"],
organization_id=os.environ["ANTHROPIC_ORGANIZATION_ID"],
service_account_id=os.environ["ANTHROPIC_SERVICE_ACCOUNT_ID"],
workspace_id=os.environ.get("ANTHROPIC_WORKSPACE_ID"),
),
)
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(message.content[0].text)Alternativ kannst du den OIDC-Issuer deines AKS-Clusters direkt bei Anthropic registrieren und den Entra-Zwischenschritt überspringen. Siehe Kubernetes für dieses Muster.
Führe von deiner Azure-Ressource aus den zuvor gezeigten cURL-Austausch aus und bestätige, dass POST /v1/oauth/token ein 200 mit einem access_token zurückgibt, das mit sk-ant-oat01- beginnt, sowie einen expires_in-Wert in Sekunden. Bei 400 invalid_grant siehe Fehlgeschlagenen Austausch beheben; die häufigste Azure-seitige Ursache ist eine Abweichung zwischen der von dir registrierten issuer_url und dem iss-Claim in deinem dekodierten Token. Sie müssen exakt übereinstimmen. Für Managed-Identity-Tokens ist der iss-Wert entweder https://login.microsoftonline.com/<TENANT_ID>/v2.0 oder https://sts.windows.net/<TENANT_ID>/.
Der oid-Claim ist die GUID einer Managed Identity und hat kein stabiles Präfix. Ein
subject_prefix mit * passt auf beliebige Identitäten im Mandanten, sodass jeder
Workload, der eine Managed Identity besitzt, ein föderiertes Anthropic-Token
erhalten könnte.
Beschränke den match-Block der Regel auf den engsten Geltungsbereich, der zu deinem Anwendungsfall passt:
oid als exakten Wert abgleichen: Setze claims.oid auf die vollständige Objekt-ID der Managed Identity und verwende niemals subject_prefix für Azure-Tokens.tid als zusätzliche Absicherung festlegen: Die Issuer-URL legt deinen Mandanten bereits fest, aber das Hinzufügen von claims.tid schützt vor Konfigurationsabweichungen, falls der Issuer-Eintrag später bearbeitet wird.audience auf https://api.anthropic.com, damit Tokens, die für andere Ressourcen ausgestellt wurden, abgelehnt werden.Was this page helpful?