Рабочие нагрузки Azure аутентифицируются в Claude API, предъявляя JSON Web Token (JWT), выданный Microsoft Entra ID, а затем обменивая его на короткоживущий токен доступа Anthropic. Существует два распространённых способа получить токен, выданный Entra:
http://169.254.169.254/metadata/identity/oauth2/token и получает JWT для назначенного ей удостоверения.AZURE_FEDERATED_TOKEN_FILE. Рабочая нагрузка обменивает этот токен в Entra на токен доступа, выданный Entra.В обоих случаях токен, выданный Entra, который вы предъявляете Anthropic, содержит специфичный для арендатора издатель Entra (точный URL для регистрации показан ниже в шаге Настройка Anthropic) и идентификатор объекта управляемого удостоверения в утверждениях sub и oid. Вы один раз регистрируете этого издателя в Anthropic, создаёте правило федерации, которое сопоставляется с ожидаемыми утверждениями, и ваша рабочая нагрузка во время выполнения обменивает свой токен Entra на токен доступа вида sk-ant-oat01-....
Поды AKS могут в качестве альтернативы пропустить обмен через Entra и предъявить Anthropic напрямую токен учётной записи службы, спроецированный Kubernetes. В этом случае в Anthropic регистрируется OIDC-издатель вашего кластера AKS вместо вашего арендатора Entra. Этот сценарий описан в разделе Kubernetes.
Настройте удостоверение, для которого Azure будет выдавать токены. Выберите вариант, соответствующий тому, где выполняется ваша рабочая нагрузка.
Токен, выданный Entra для управляемого удостоверения, содержит следующие утверждения:
{
"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 и oid идентичны (идентификатор объекта управляемого удостоверения). azp — это идентификатор приложения или клиента. Сопоставляйте по oid, чтобы авторизовать одно конкретное удостоверение, или по azp, чтобы авторизовать любое удостоверение, связанное с регистрацией приложения. Утверждение tid повторяет идентификатор вашего арендатора; сопоставление по нему — это дополнительный уровень защиты, поскольку URL издателя уже фиксирует арендатора.
Следуйте пошаговому руководству по настройке, чтобы зарегистрировать издателя федерации, создать учётную запись службы Anthropic и создать правило федерации в Claude Console. В Console выберите вариант провайдера OIDC и укажите приведённые ниже значения, специфичные для Entra.
Издатель федерации: Entra публикует документ обнаружения OIDC по URL издателя, специфичному для арендатора, поэтому используйте режим обнаружения. Для каждого федерируемого арендатора Azure требуется собственная запись издателя.
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks_source": "discovery"
}В зависимости от версии токена утверждение iss может иметь вид https://sts.windows.net/<TENANT_ID>/. Декодируйте ваш токен управляемого удостоверения (как это сделать, показано ниже в разделе «Проверка») и зарегистрируйте то значение iss, которое он содержит. Оба URL используют один и тот же JWKS, поэтому режим обнаружения работает для любого из них.
Правило федерации: сопоставляйте по идентификатору объекта управляемого удостоверения и идентификатору вашего арендатора.
{
"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
}Во время выполнения ваша рабочая нагрузка получает свой токен Entra, обменивает его через POST /v1/oauth/token и использует возвращённый bearer-токен для обращения к Claude. Каждый SDK Anthropic берёт на себя обмен и цикл обновления, если вы передаёте вызываемый объект — поставщик токенов, как показано в следующих примерах. Вкладка cURL демонстрирует «сырой» поток.
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)В AKS файл по пути AZURE_FEDERATED_TOKEN_FILE — это токен учётной записи службы, спроецированный Kubernetes и подписанный OIDC-издателем вашего кластера, а не токен, выданный Entra. Чтобы остаться на пути через Entra, описанном на этой странице, сначала обменяйте этот токен по адресу https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token (федеративный грант client_credentials), а затем передайте полученный токен доступа Entra в SDK Anthropic в качестве токена удостоверения.
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)В качестве альтернативы зарегистрируйте OIDC-издатель вашего кластера AKS напрямую в Anthropic и пропустите шаг через Entra. Этот подход описан в разделе Kubernetes.
Из вашего ресурса Azure выполните показанный ранее обмен через cURL и убедитесь, что POST /v1/oauth/token возвращает 200 с полем access_token, начинающимся с sk-ant-oat01-, и значением expires_in в секундах. При ошибке 400 invalid_grant см. раздел Устранение неполадок при неудачном обмене; наиболее частая причина на стороне Azure — несовпадение между зарегистрированным вами issuer_url и утверждением iss в декодированном токене. Они должны совпадать точно. Для токенов управляемого удостоверения значение iss — это либо https://login.microsoftonline.com/<TENANT_ID>/v2.0, либо https://sts.windows.net/<TENANT_ID>/.
Утверждение oid — это GUID управляемого удостоверения, и у него нет
стабильного префикса. subject_prefix с * соответствует произвольным
удостоверениям в арендаторе, поэтому любая рабочая нагрузка, обладающая
управляемым удостоверением, сможет получить федеративный токен Anthropic.
Ограничьте блок match правила до минимально необходимой области, подходящей для вашего сценария:
oid как точное значение: задайте claims.oid равным полному идентификатору объекта управляемого удостоверения и никогда не используйте subject_prefix для токенов Azure.tid как дополнительный уровень защиты: URL издателя уже фиксирует вашего арендатора, но добавление claims.tid защищает от дрейфа конфигурации, если запись издателя будет позднее изменена.audience равным https://api.anthropic.com, чтобы токены, выпущенные для других ресурсов, отклонялись.Was this page helpful?