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 la même structure sur chaque plateforme Azure :
POST /v1/oauth/token contre un jeton d'accès Anthropic sk-ant-oat01-... et l'utilise pour appeler Claude.Dans les deux cas, le jeton que vous présentez à Anthropic contient 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'emplacement d'exécution de 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 sous la forme d'une 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'identificateur 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 cette approche 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 depuis le point de terminaison de jeton local de la plateforme, puis échange ce JWT auprès d'Anthropic.
Attacher une identité managée
Activez une identité managée attribuée par le système ou attribué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é attribué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 le trouverez sur la page Identity de la ressource ; pour une identité attribué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 plusieurs identités managées attribuées 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 de la présence ou non d'une identité attribuée par le système activée sur la ressource : si c'est le cas, la demande se rabat silencieusement sur cette identité et échoue ensuite à la correspondance oid de votre règle de fédération ; sinon, la demande échoue immédiatement dès qu'une deuxième identité attribuée par l'utilisateur est attachée.
Décoder un exemple de jeton
Demandez un jeton au point de terminaison et décodez sa charge utile pour confirmer les revendications que votre règle de fédération doit faire correspondre. (Pour la commande de décodage, consultez Dépanner un échange échoué.) Un jeton v2.0 pour une identité managée contient 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 | Faire 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 le comportement par défaut ; la règle dans Configurer Anthropic effectue cette correspondance. |
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é, 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 | Votre ID de 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 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 vignette Microsoft Entra. L'assistant vous guide à travers 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 par défaut sur v1 ; cette valeur par défaut existe pour les locataires réutilisant d'anciennes inscriptions qui émettent encore des jetons v1.0.) Entra publie un document de découverte OIDC à l'URL d'émetteur spécifique au locataire, donc utilisez 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 un rafraîchissement anticipé, et la valeur par défaut de 1 heure de l'émetteur rejette ces jetons avec invalid_grant. La vignette 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, donc terminez 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 fuite, le levier consiste à désactiver la règle de fédération ; une correspondance oid stricte limite les identités pouvant échanger un jeton en premier lieu, comme décrit dans Délimiter votre règle.
Règle de fédération : Faites correspondre l'ID d'objet de l'identité managée et votre ID de 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 que l'échange renvoie, pas celle du jeton Entra ; le SDK le rafraîchit pour vous.
Au moment de l'exécution, votre charge de travail récupère son jeton Entra, l'échange via POST /v1/oauth/token et utilise le jeton porteur renvoyé pour appeler Claude. Chaque SDK Anthropic gère l'échange et la boucle de rafraîchissement lorsque vous fournissez un callable fournisseur de jeton, comme illustré dans 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 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, passez 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 bon point de terminaison sur chaque plateforme Azure, y compris AKS avec Entra Workload Identity.
import os
import anthropic
import requests
from anthropic import WorkloadIdentityCredentials
# L'URI d'identificateur de l'inscription d'application d'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 groupe de machines virtuelles identiques : 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-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(message.content[0].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 les plus courantes côté Azure :
issuer_url enregistrée doit correspondre exactement à la revendication iss du jeton. Un jeton v2.0 contient 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 de 1 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 cette approche 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 attribué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 étapes : elle échange d'abord le jeton projeté à l'adresse https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token (grant 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 alternativement ignorer l'échange Entra et présenter directement le jeton de compte de service projeté par Kubernetes à Anthropic. Cette approche 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 workload identity sur votre cluster
L'activation de workload identity installe le webhook de mutation azure-workload-identity pour vous ; ne le déployez manuellement que sur les clusters non-AKS. Capturez l'URL de l'émetteur OIDC du cluster pour l'identifiant fédéré que vous créerez dans 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 attribué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 que votre règle de fédération Anthropic fait correspondre.
az identity create \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--location <LOCATION>
# Placé 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 que votre règle de fédération fait correspondre.
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 l'identifiant fédéré sur l'identité managée
L'identifiant fédéré fait 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 lien 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 situé à 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 exemple de jeton
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 contient la même structure de revendications que le chemin d'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 d'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 vignette Microsoft Entra. L'assistant vous guide à travers 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 par défaut sur v1 ; cette valeur par défaut existe pour les locataires réutilisant d'anciennes inscriptions qui émettent encore des jetons v1.0.) Entra publie un document de découverte OIDC à l'URL d'émetteur spécifique au locataire, donc utilisez 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 vignette 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 politique de durée de vie de jeton du locataire ou Continuous Access Evaluation (CAE) peut prolonger cette durée de vie. Si la différence entre exp et 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 fuite, le levier consiste à désactiver la règle de fédération ; une correspondance oid stricte limite les identités pouvant échanger un jeton en premier lieu, comme décrit dans Délimiter votre règle.
Règle de fédération : Faites correspondre l'ID d'objet de l'identité managée et votre ID de 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 que l'échange renvoie, pas celle du jeton Entra ; le SDK le rafraîchit pour vous.
Au moment de l'exécution, le pod effectue l'échange en deux étapes : il envoie le jeton projeté par Kubernetes (le fichier situé à 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 via POST /v1/oauth/token. Chaque SDK Anthropic gère le second échange et la boucle de rafraîchissement lorsque vous fournissez la récupération Entra comme callable fournisseur de jeton, comme illustré dans 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, passez 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 étapes. 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-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(message.content[0].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 les plus courantes côté Azure :
issuer_url enregistrée doit correspondre exactement à la revendication iss du jeton. Un jeton v2.0 contient 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 présente 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 exemple de jeton et vérifiez sa revendication ver ; si elle est 1.0, quatre éléments 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 contient. 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 passé 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 fait correspondre azp ne passe jamais avec un jeton v1.0.Les revendications oid, sub et tid contiennent les mêmes valeurs dans les deux versions, donc le reste de ce guide s'applique sans modification.
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 map claims ; consultez Sémantique de correspondance des règles pour comprendre 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 avec caractère générique ou
GUID partiel, autorise chaque identité managée et principal de service
du locataire.
Verrouillez le bloc match de la règle à 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 avec caractère générique ou GUID partiel, qui correspond à plus d'identités que prévu.tid comme défense en profondeur : L'URL de l'émetteur épingle déjà votre locataire, mais ajouter 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?