Les charges de travail Azure s'authentifient auprès de l'API Claude en présentant un « JSON Web Token » (jeton Web JSON), ou JWT, émis par Microsoft Entra ID, puis en l'échangeant contre un jeton d'accès Anthropic de courte durée. La configuration suit le même schéma sur chaque plateforme Azure :
POST /v1/oauth/token contre un jeton d'accès Anthropic sk-ant-oat01-... et appelle Claude avec celui-ci.Sur les deux chemins, le jeton que vous présentez à Anthropic porte l'émetteur Entra spécifique à votre locataire et l'ID d'objet de l'identité managée dans les revendications sub et oid ; seule la manière dont la charge de travail obtient ce jeton diffère. Choisissez la section correspondant à l'endroit où s'exécute votre charge de travail : Utiliser une identité managée pour les VM, les VM Scale Sets, App Service, Functions ou Container Apps ; Utiliser Entra Workload Identity sur AKS pour AKS.
Microsoft Entra ID n'émet un jeton que lorsque l'audience demandée existe dans votre locataire en tant qu'inscription d'application avec un principal de service. Créez une inscription d'application pour représenter l'audience de l'API Claude ; chaque charge de travail du locataire peut demander des jetons pour celle-ci. Sans cette inscription, les demandes de jeton échouent avec une erreur « resource not found in tenant » (AADSTS50001 depuis les points de terminaison d'identité managée, AADSTS500011 depuis le point de terminaison de jeton Entra).
# Créez l'inscription d'application qui représente l'audience de l'API Claude.
APP_ID=$(az ad app create --display-name claude-api-federation --query appId -o tsv)
# Demandez des jetons d'accès v2.0 et définissez l'URI d'identifiant api://<APP_ID>.
az ad app update --id "$APP_ID" \
--identifier-uris "api://$APP_ID" \
--set api.requestedAccessTokenVersion=2
# Créez le principal de service afin que l'audience soit résolue dans votre locataire.
az ad sp create --id "$APP_ID"Utilisez le format d'URI d'identificateur api://<APP_ID>. Entra restreint les URI d'identificateur https:// aux domaines vérifiés de votre propre locataire, donc un URI tel que https://api.anthropic.com ne peut pas être enregistré dans la plupart des locataires ; api://<APP_ID> est accepté partout. Avec requestedAccessTokenVersion: 2, les jetons pour cette audience sont en v2.0, ce que ce guide suppose. Si vous réutilisez une inscription existante qui émet des jetons v1.0, consultez Si vos jetons sont en v1.0.
Utilisez ce chemin lorsque votre charge de travail s'exécute sur une VM, un VM Scale Set, App Service, Functions ou Container Apps. La charge de travail demande un JWT émis par Entra pour son identité managée attribuée auprès du point de terminaison de jeton local de la plateforme, puis échange ce JWT avec Anthropic.
Attacher une identité managée
Activez une identité managée affectée par le système ou affectée par l'utilisateur sur votre ressource Azure. Dans le portail Azure, ouvrez la ressource, accédez à Identity et activez System assigned (ou attachez une identité affectée par l'utilisateur).
Une fois l'identité créée, notez son Object (principal) ID. Ce GUID apparaît à la fois dans les revendications sub et oid du jeton émis, et votre règle de fédération Anthropic effectuera la correspondance sur celui-ci. Vous pouvez le trouver sur la page Identity de la ressource ; pour une identité affectée par l'utilisateur, il s'agit de l'Object (principal) ID sur la page Overview de la ressource d'identité managée. (Une identité managée ne possède qu'un principal de service dans Microsoft Entra ID, pas d'inscription d'application.)
Trouver le point de terminaison de jeton de la plateforme
La plateforme expose un point de terminaison de jeton local une fois l'identité attachée :
http://169.254.169.254/metadata/identity/oauth2/token avec l'en-tête Metadata: true et api-version=2018-02-01.IDENTITY_ENDPOINT avec l'en-tête X-IDENTITY-HEADER défini sur la valeur de IDENTITY_HEADER, et api-version=2019-08-01. IMDS n'est pas accessible sur ces plateformes.Si la ressource possède plus d'une identité managée affectée par l'utilisateur, ajoutez client_id=<IDENTITY_CLIENT_ID> à la demande de jeton pour en sélectionner une. Azure recommande de toujours le spécifier. Sans cela, le résultat dépend du fait que la ressource ait également une identité affectée par le système activée : si c'est le cas, la demande se rabat silencieusement sur cette identité puis échoue à la correspondance oid de votre règle de fédération ; sinon, la demande échoue immédiatement dès qu'une deuxième identité affectée par l'utilisateur est attachée.
Décoder un jeton d'exemple
Demandez un jeton au point de terminaison et décodez sa charge utile pour confirmer les revendications auxquelles votre règle de fédération doit correspondre. (Pour la commande de décodage, consultez Dépanner un échange échoué.) Un jeton v2.0 pour une identité managée porte ces revendications :
{
"iss": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"sub": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"aud": "<APP_ID>",
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>",
"azp": "<IDENTITY_CLIENT_ID>",
"ver": "2.0",
"exp": 1775527120
}| Revendication | Valeur | Faites correspondre ceci lorsque |
|---|---|---|
oid | L'ID d'objet de l'identité managée, identique à sub | Vous souhaitez autoriser une identité managée spécifique. C'est la valeur par défaut ; la règle dans Configurer Anthropic y correspond. |
azp | L'ID client de l'identité appelante | Vous souhaitez autoriser chaque charge de travail qui partage une même inscription d'application. Pour une identité managée, azp est unique à cette identité, il est donc équivalent à oid. |
aud | L'ID client de l'inscription d'application d'audience (le GUID <APP_ID> de Enregistrer l'audience du jeton) | Toujours. Le champ audience de la règle doit être exactement égal à la valeur aud du jeton. |
tid | L'ID de votre locataire | Vous souhaitez une défense en profondeur. L'URL de l'émetteur épingle déjà le locataire. |
Si la revendication ver du jeton décodé est 1.0, les noms et les valeurs des revendications diffèrent. Consultez Si vos jetons sont en v1.0 avant de continuer.
Dans la Claude Console, ouvrez Settings → Workload identity, cliquez sur Connect workload et sélectionnez la tuile Microsoft Entra. L'assistant vous guide dans l'enregistrement de l'émetteur, la création d'un compte de service et la création d'une règle de fédération.
L'assistant crée ces ressources pour vous. Utilisez les valeurs suivantes, que vous les saisissiez dans l'assistant ou que vous les envoyiez à l'Admin API :
Émetteur de fédération : Choisissez v2.0 (login.microsoftonline.com) dans le sélecteur Token issuer de l'assistant. (Le sélecteur est défini par défaut sur v1 ; cette valeur par défaut existe pour les locataires réutilisant des inscriptions plus anciennes qui émettent encore des jetons v1.0.) Entra publie un document de découverte OIDC à l'URL d'émetteur propre à chaque locataire, utilisez donc le mode découverte. Chaque locataire Microsoft Entra que vous fédérez nécessite son propre enregistrement d'émetteur.
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks": { "type": "discovery" },
"max_jwt_lifetime_seconds": 86400
}Les charges de travail à identité managée nécessitent max_jwt_lifetime_seconds: 86400. Azure émet des jetons d'identité managée avec jusqu'à 24 heures entre iat et exp, car il met en cache le jeton de chaque ressource pendant cette fenêtre et n'offre aucun moyen de forcer une actualisation anticipée, et la valeur par défaut d'une heure de l'émetteur rejette ces jetons avec invalid_grant. La tuile Microsoft Entra de l'assistant Connect workload crée l'émetteur avec max_jwt_lifetime_seconds défini sur 7500 et ne fournit aucun champ pour le modifier lors de la création ; terminez donc l'assistant, puis ouvrez Settings → Workload identity → Issuers, modifiez l'émetteur et augmentez la valeur à 86400. Vous pouvez également mettre à jour l'émetteur via l'Admin API.
Une durée de vie acceptée plus longue signifie qu'un jeton Entra divulgué reste échangeable plus longtemps. Si un jeton fuit, le levier consiste à désactiver la règle de fédération ; une correspondance oid stricte limite dès le départ les identités qui peuvent échanger un jeton, comme décrit dans Délimiter votre règle.
Règle de fédération : Effectuez la correspondance sur l'ID d'objet de l'identité managée et l'ID de votre locataire. Pour les jetons v2.0 que ce guide configure, la valeur audience est l'ID client de l'inscription d'application d'audience (le GUID <APP_ID> de Enregistrer l'audience du jeton). Utilisez la valeur aud exacte de votre jeton décodé.
{
"name": "azure-inference-worker",
"issuer_id": "fdis_...",
"match": {
"audience": "<APP_ID>",
"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
}token_lifetime_seconds est la durée de vie du jeton d'accès Anthropic renvoyé par l'échange, pas celle du jeton Entra ; le SDK l'actualise pour vous.
À l'exécution, votre charge de travail récupère son jeton Entra, l'échange à POST /v1/oauth/token et utilise le jeton bearer renvoyé pour appeler Claude. Chaque SDK Anthropic gère l'échange et la boucle d'actualisation lorsque vous fournissez un appelable fournisseur de jetons, comme le montrent les exemples suivants. L'onglet cURL montre le flux brut.
Les exemples récupèrent le jeton d'identité managée depuis le point de terminaison de jeton de la plateforme : IMDS sur les VM et les VM Scale Sets, ou le service IDENTITY_ENDPOINT sur App Service, Functions et Container Apps. Remplacez <APP_ID> dans la valeur de ressource api://<APP_ID> par l'ID client de l'inscription d'application d'audience de Enregistrer l'audience du jeton.
Si votre charge de travail utilise déjà la bibliothèque cliente Azure Identity, transmettez son acquisition de jeton (DefaultAzureCredential avec la portée api://<APP_ID>/.default) comme fournisseur de jeton d'identité au lieu d'appeler directement les points de terminaison de jeton. La bibliothèque sélectionne le point de terminaison correct sur chaque plateforme Azure, y compris AKS avec Entra Workload Identity.
import os
import anthropic
import requests
from anthropic import WorkloadIdentityCredentials
# L'URI d'identifiant de l'inscription d'application de l'audience (voir Inscrire l'audience du jeton).
AUDIENCE = "api://<APP_ID>"
def fetch_entra_token() -> str:
"""Fetch a managed identity token from the platform's token endpoint."""
# Avec plusieurs identités affectées par l'utilisateur, ajoutez client_id=<IDENTITY_CLIENT_ID>
# aux paramètres de la requête pour en sélectionner une.
if endpoint := os.environ.get("IDENTITY_ENDPOINT"):
# App Service, Functions, Container Apps
response = requests.get(
endpoint,
headers={"X-IDENTITY-HEADER": os.environ["IDENTITY_HEADER"]},
params={"api-version": "2019-08-01", "resource": AUDIENCE},
timeout=5,
)
else:
# VM ou VM Scale Set : Azure Instance Metadata Service (IMDS)
response = requests.get(
"http://169.254.169.254/metadata/identity/oauth2/token",
headers={"Metadata": "true"},
params={"api-version": "2018-02-01", "resource": AUDIENCE},
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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(next(block.text for block in message.content if block.type == "text"))Depuis votre ressource Azure, exécutez l'échange cURL présenté dans Acquérir et utiliser le jeton et confirmez que POST /v1/oauth/token renvoie un 200 avec un access_token commençant par sk-ant-oat01- et une valeur expires_in en secondes. En cas de 400 invalid_grant, décodez le jeton Entra (consultez Dépanner un échange échoué pour la commande) et vérifiez les causes côté Azure les plus courantes :
issuer_url enregistrée doit correspondre exactement à la revendication iss du jeton. Un jeton v2.0 porte https://login.microsoftonline.com/<TENANT_ID>/v2.0 ; si la revendication ver décodée est 1.0, consultez Si vos jetons sont en v1.0.iat et exp. Si l'émetteur a toujours la valeur 7500 de l'assistant (ou la valeur par défaut d'une heure), augmentez max_jwt_lifetime_seconds à 86400 comme décrit dans Configurer Anthropic.audience de la règle doit être exactement égale à l'aud du jeton : l'ID client de l'inscription d'application d'audience pour les jetons v2.0 que ce guide configure.appid, pas dans azp ; consultez Si vos jetons sont en v1.0.Utilisez ce chemin lorsque votre charge de travail s'exécute dans un pod AKS. Entra Workload Identity fédère un compte de service Kubernetes avec une identité managée affectée par l'utilisateur : Kubernetes projette un jeton de compte de service (signé par l'émetteur OIDC du cluster AKS) dans le pod au chemin indiqué dans AZURE_FEDERATED_TOKEN_FILE. Ce jeton projeté n'est pas un jeton émis par Entra, donc pour rester sur le chemin médié par Entra décrit sur cette page, la charge de travail effectue un échange en deux sauts : elle échange d'abord le jeton projeté à https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token (octroi client_credentials fédéré) contre un jeton d'accès émis par Entra, puis transmet ce jeton Entra au SDK Anthropic comme jeton d'identité.
Les pods AKS peuvent également ignorer l'échange Entra et présenter directement à Anthropic le jeton de compte de service projeté par Kubernetes. Ce chemin enregistre l'émetteur OIDC de votre cluster AKS auprès d'Anthropic au lieu de votre locataire Entra. Consultez Utiliser WIF avec Kubernetes pour ce flux.
Activer l'émetteur OIDC et l'identité de charge de travail sur votre cluster
L'activation de l'identité de charge de travail installe pour vous le webhook de mutation azure-workload-identity ; déployez-le manuellement uniquement sur les clusters non AKS. Capturez l'URL de l'émetteur OIDC du cluster pour les informations d'identification fédérées que vous créerez à une étape ultérieure.
az aks update \
--resource-group <RESOURCE_GROUP> \
--name <CLUSTER_NAME> \
--enable-oidc-issuer \
--enable-workload-identity
AKS_OIDC_ISSUER=$(az aks show \
--resource-group <RESOURCE_GROUP> \
--name <CLUSTER_NAME> \
--query oidcIssuerProfile.issuerUrl -o tsv)Créer une identité managée affectée par l'utilisateur
Capturez deux valeurs de l'identité : le Client ID va dans l'annotation du compte de service (et est injecté dans le pod en tant que AZURE_CLIENT_ID), et l'Object (principal) ID apparaît comme la revendication oid à laquelle votre règle de fédération Anthropic correspond.
az identity create \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--location <LOCATION>
# Va dans l'annotation du compte de service ; injecté dans le pod en tant que AZURE_CLIENT_ID.
IDENTITY_CLIENT_ID=$(az identity show \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--query clientId -o tsv)
# Apparaît comme la revendication oid à laquelle votre règle de fédération correspond.
IDENTITY_OBJECT_ID=$(az identity show \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--query principalId -o tsv)Créer le compte de service Kubernetes annoté
Le webhook azure-workload-identity lit l'annotation azure.workload.identity/client-id pour injecter AZURE_CLIENT_ID dans le pod, que les exemples de Acquérir et utiliser le jeton lisent depuis l'environnement.
apiVersion: v1
kind: ServiceAccount
metadata:
name: claude-inference
namespace: inference
annotations:
azure.workload.identity/client-id: <IDENTITY_CLIENT_ID>Créer les informations d'identification fédérées sur l'identité managée
Les informations d'identification fédérées font confiance à l'émetteur OIDC de votre cluster pour ce compte de service spécifique. La valeur --audience api://AzureADTokenExchange est l'audience fixe d'Entra pour les jetons de compte de service Kubernetes entrants ; elle n'a aucun rapport avec l'audience de l'API Claude que vous avez enregistrée précédemment.
az identity federated-credential create \
--resource-group <RESOURCE_GROUP> \
--identity-name claude-inference-identity \
--name claude-inference-aks \
--issuer "$AKS_OIDC_ISSUER" \
--subject system:serviceaccount:inference:claude-inference \
--audience api://AzureADTokenExchangeÉtiqueter le pod et définir son compte de service
Le pod doit porter l'étiquette azure.workload.identity/use: "true" et s'exécuter en tant que compte de service annoté. Le webhook injecte alors AZURE_FEDERATED_TOKEN_FILE, AZURE_CLIENT_ID et AZURE_TENANT_ID dans le pod. Le fichier à AZURE_FEDERATED_TOKEN_FILE contient le jeton de compte de service projeté par Kubernetes, signé par l'émetteur OIDC du cluster AKS.
apiVersion: v1
kind: Pod
metadata:
name: inference-worker
namespace: inference
labels:
azure.workload.identity/use: "true"
spec:
serviceAccountName: claude-inference
containers:
- name: app
image: your-registry/inference-worker:latestDécoder un jeton d'exemple
Le jeton que votre règle de fédération Anthropic voit n'est pas le fichier projeté ; c'est le jeton émis par Entra renvoyé par l'échange client_credentials. Depuis l'intérieur d'un pod étiqueté, exécutez l'étape 1 de l'exemple cURL dans Acquérir et utiliser le jeton et décodez le résultat. Il porte la même forme de revendications que le chemin de l'identité managée :
{
"iss": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"sub": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"aud": "<APP_ID>",
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>",
"azp": "<IDENTITY_CLIENT_ID>",
"ver": "2.0",
"exp": 1775527120
}sub et oid sont l'ID d'objet de l'identité managée, aud est l'ID client de l'inscription d'application d'audience, et azp est l'ID client de l'identité managée (la valeur de AZURE_CLIENT_ID). La durée de vie diffère du chemin de l'identité managée : les jetons client_credentials ont par défaut une fenêtre aléatoire de 60 à 90 minutes entre iat et exp, et non 24 heures.
Dans la Claude Console, ouvrez Settings → Workload identity, cliquez sur Connect workload et sélectionnez la tuile Microsoft Entra. L'assistant vous guide dans l'enregistrement de l'émetteur, la création d'un compte de service et la création d'une règle de fédération.
L'assistant crée ces ressources pour vous. Utilisez les valeurs suivantes, que vous les saisissiez dans l'assistant ou que vous les envoyiez à l'Admin API :
Émetteur de fédération : Choisissez v2.0 (login.microsoftonline.com) dans le sélecteur Token issuer de l'assistant. (Le sélecteur est défini par défaut sur v1 ; cette valeur par défaut existe pour les locataires réutilisant des inscriptions plus anciennes qui émettent encore des jetons v1.0.) Entra publie un document de découverte OIDC à l'URL d'émetteur propre à chaque locataire, utilisez donc le mode découverte. Chaque locataire Microsoft Entra que vous fédérez nécessite son propre enregistrement d'émetteur.
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks": { "type": "discovery" },
"max_jwt_lifetime_seconds": 7500
}La tuile Microsoft Entra de l'assistant Connect workload crée l'émetteur avec max_jwt_lifetime_seconds défini sur 7500 (un peu plus de 2 heures), ce qui couvre la durée de vie par défaut de 60 à 90 minutes des jetons client_credentials. Une stratégie de durée de vie des jetons du locataire ou l'évaluation continue de l'accès (CAE) peut prolonger cette durée de vie. Si exp moins iat de votre jeton décodé dépasse 7500 secondes, modifiez l'émetteur dans Settings → Workload identity → Issuers et augmentez max_jwt_lifetime_seconds en conséquence, sinon les échanges échouent avec invalid_grant. Si votre locataire exécute également des charges de travail à identité managée de Utiliser une identité managée, utilisez la valeur 86400 de cette section, qui couvre les deux chemins.
Une durée de vie acceptée plus longue signifie qu'un jeton Entra divulgué reste échangeable plus longtemps. Si un jeton fuit, le levier consiste à désactiver la règle de fédération ; une correspondance oid stricte limite dès le départ les identités qui peuvent échanger un jeton, comme décrit dans Délimiter votre règle.
Règle de fédération : Effectuez la correspondance sur l'ID d'objet de l'identité managée et l'ID de votre locataire. Pour les jetons v2.0 que ce guide configure, la valeur audience est l'ID client de l'inscription d'application d'audience (le GUID <APP_ID> de Enregistrer l'audience du jeton). Utilisez la valeur aud exacte de votre jeton décodé.
{
"name": "azure-inference-worker",
"issuer_id": "fdis_...",
"match": {
"audience": "<APP_ID>",
"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
}token_lifetime_seconds est la durée de vie du jeton d'accès Anthropic renvoyé par l'échange, pas celle du jeton Entra ; le SDK l'actualise pour vous.
À l'exécution, le pod effectue l'échange en deux sauts : il envoie le jeton projeté par Kubernetes (le fichier à AZURE_FEDERATED_TOKEN_FILE) au point de terminaison de jeton d'Entra en tant qu'assertion client_credentials fédérée, puis échange le jeton d'accès Entra résultant à POST /v1/oauth/token. Chaque SDK Anthropic gère le second échange et la boucle d'actualisation lorsque vous fournissez la récupération Entra comme appelable fournisseur de jetons, comme le montrent les exemples suivants. L'onglet cURL montre le flux brut.
Deux ID client différents apparaissent dans les exemples. <APP_ID> est l'ID client de l'inscription d'application d'audience de Enregistrer l'audience du jeton ; la portée api://<APP_ID>/.default demande à Entra un jeton adressé à cette audience. $AZURE_CLIENT_ID est l'ID client de l'identité managée, injecté par le webhook, et identifie l'appelant. Ne substituez pas l'un à l'autre.
Si votre charge de travail utilise déjà la bibliothèque cliente Azure Identity, transmettez son acquisition de jeton (DefaultAzureCredential avec la portée api://<APP_ID>/.default) comme fournisseur de jeton d'identité au lieu d'effectuer vous-même l'échange en deux sauts. La bibliothèque lit les mêmes variables d'environnement AZURE_FEDERATED_TOKEN_FILE, AZURE_CLIENT_ID et AZURE_TENANT_ID et gère l'échange Entra.
import os
from pathlib import Path
import anthropic
import requests
from anthropic import WorkloadIdentityCredentials
def fetch_entra_token_via_federation() -> str:
federated_token = Path(os.environ["AZURE_FEDERATED_TOKEN_FILE"]).read_text()
response = requests.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": "api://<APP_ID>/.default",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": federated_token,
},
timeout=5,
)
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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(next(block.text for block in message.content if block.type == "text"))Depuis l'intérieur d'un pod étiqueté, exécutez l'échange cURL présenté dans Acquérir et utiliser le jeton et confirmez que POST /v1/oauth/token renvoie un 200 avec un access_token commençant par sk-ant-oat01- et une valeur expires_in en secondes. En cas de 400 invalid_grant, décodez le jeton émis par Entra de l'étape 1 (consultez Dépanner un échange échoué pour la commande) et vérifiez les causes côté Azure les plus courantes :
issuer_url enregistrée doit correspondre exactement à la revendication iss du jeton. Un jeton v2.0 porte https://login.microsoftonline.com/<TENANT_ID>/v2.0 ; si la revendication ver décodée est 1.0, consultez Si vos jetons sont en v1.0.client_credentials au-delà de 7500 secondes, augmentez le max_jwt_lifetime_seconds de l'émetteur comme décrit dans Configurer Anthropic.audience de la règle doit être exactement égale à l'aud du jeton : l'ID client de l'inscription d'application d'audience pour les jetons v2.0 que ce guide configure.appid, pas dans azp ; consultez Si vos jetons sont en v1.0.Ce guide configure l'inscription d'application d'audience avec api.requestedAccessTokenVersion: 2, donc chaque jeton qu'il montre est en v2.0. Si vous réutilisez une inscription existante qui laisse requestedAccessTokenVersion non défini, Entra émet des jetons v1.0 à la place. Décodez un jeton d'exemple et vérifiez sa revendication ver ; si elle est 1.0, quatre choses changent :
iss est https://sts.windows.net/<TENANT_ID>/ au lieu de https://login.microsoftonline.com/<TENANT_ID>/v2.0. Enregistrez l'URL de l'émetteur exactement telle que la revendication iss de votre jeton la porte. Les deux URL partagent le même JWKS, donc le mode découverte fonctionne pour l'une ou l'autre.aud est l'URI d'identificateur que vous avez transmis comme resource (par exemple, api://<APP_ID>), pas l'ID client de l'inscription. Définissez l'audience de la règle de fédération sur la valeur aud exacte de votre jeton décodé.appid, pas dans azp. Les deux revendications n'apparaissent jamais dans le même jeton, donc une règle qui effectue la correspondance sur azp ne passe jamais avec un jeton v1.0.Les revendications oid, sub et tid portent les mêmes valeurs dans les deux versions, donc le reste de ce guide s'applique sans changement.
Une règle de fédération peut faire correspondre le sujet du jeton avec subject_prefix en plus de (ou à la place de) la carte claims ; consultez Sémantique de correspondance des règles pour savoir comment les champs se combinent. Les valeurs sub d'Entra pour ces identités sont des GUID canoniques de longueur fixe, donc un subject_prefix contenant l'ID d'objet complet de 36 caractères ne correspond qu'à ce sujet ; c'est une propriété du format de sujet d'Entra, pas de subject_prefix en général.
Chaque identité de votre locataire peut demander un jeton pour l'audience enregistrée,
donc audience et tid seuls n'identifient pas une charge de travail spécifique. Une règle qui
omet une correspondance oid (ou azp/appid), ou qui utilise un subject_prefix générique ou
avec un GUID partiel, autorise chaque identité managée et chaque principal
de service du locataire.
Verrouillez le bloc match de la règle sur la portée la plus étroite qui convient à votre cas d'usage :
oid comme valeur exacte : Définissez claims.oid sur l'ID d'objet complet de l'identité managée. Un subject_prefix défini sur cet ID d'objet complet est équivalent (l'assistant de la Console définit les deux) ; n'utilisez jamais un subject_prefix générique ou avec un GUID partiel, qui correspond à plus d'identités que vous ne le souhaitez.tid comme défense en profondeur : L'URL de l'émetteur épingle déjà votre locataire, mais l'ajout de claims.tid protège contre une dérive de configuration si l'enregistrement de l'émetteur est modifié ultérieurement.audience sur la valeur aud exacte de votre jeton décodé afin que les jetons émis pour d'autres applications soient rejetés.Was this page helpful?