Рабочие нагрузки Azure аутентифицируются в Claude API, предъявляя JSON Web Token (JWT), выданный Microsoft Entra ID, а затем обменивая его на краткосрочный токен доступа Anthropic. Настройка имеет одинаковую структуру на каждой платформе Azure:
POST /v1/oauth/token на токен доступа Anthropic sk-ant-oat01-... и вызывает Claude с его помощью.На обоих путях токен, который вы предъявляете Anthropic, содержит специфичного для вашего арендатора издателя Entra и идентификатор объекта управляемого удостоверения в утверждениях sub и oid; различается только способ, которым рабочая нагрузка получает этот токен. Выберите раздел в зависимости от того, где выполняется ваша рабочая нагрузка: Использование управляемого удостоверения для VM, VM Scale Sets, App Service, Functions или Container Apps; Использование Entra Workload Identity на AKS для AKS.
Microsoft Entra ID выдаёт токен только тогда, когда запрошенная аудитория существует в вашем арендаторе как регистрация приложения с субъектом-службой. Создайте одну регистрацию приложения, представляющую аудиторию Claude API; каждая рабочая нагрузка в арендаторе может запрашивать токены для неё. Без этой регистрации запросы токенов завершаются ошибкой «resource not found in tenant» (AADSTS50001 от конечных точек управляемого удостоверения, AADSTS500011 от конечной точки токенов Entra).
# Создайте регистрацию приложения, представляющую аудиторию Claude API.
APP_ID=$(az ad app create --display-name claude-api-federation --query appId -o tsv)
# Запросите токены доступа v2.0 и задайте URI идентификатора api://<APP_ID>.
az ad app update --id "$APP_ID" \
--identifier-uris "api://$APP_ID" \
--set api.requestedAccessTokenVersion=2
# Создайте сервисный принципал, чтобы аудитория разрешалась в вашем арендаторе.
az ad sp create --id "$APP_ID"Используйте формат URI идентификатора api://<APP_ID>. Entra ограничивает URI идентификаторов https:// проверенными доменами вашего собственного арендатора, поэтому URI, такой как https://api.anthropic.com, не может быть зарегистрирован в большинстве арендаторов; api://<APP_ID> принимается везде. С requestedAccessTokenVersion: 2 токены для этой аудитории имеют версию v2.0, что и предполагается в этом руководстве. Если вы повторно используете существующую регистрацию, которая выдаёт токены v1.0, см. Если ваши токены имеют версию v1.0.
Используйте этот путь, когда ваша рабочая нагрузка выполняется на VM, VM Scale Set, App Service, Functions или Container Apps. Рабочая нагрузка запрашивает выданный Entra JWT для назначенного ей управляемого удостоверения у локальной конечной точки токенов платформы, а затем обменивает этот JWT с Anthropic.
Подключите управляемое удостоверение
Включите назначаемое системой или назначаемое пользователем управляемое удостоверение на вашем ресурсе Azure. На портале Azure откройте ресурс, перейдите в Identity и включите System assigned (или подключите назначаемое пользователем удостоверение).
После создания удостоверения запишите его Object (principal) ID. Этот GUID появляется как в утверждении sub, так и в oid выданного токена, и ваше правило федерации Anthropic будет сопоставляться с ним. Вы можете найти его на странице Identity ресурса; для назначаемого пользователем удостоверения это Object (principal) ID на странице Overview ресурса управляемого удостоверения. (Управляемое удостоверение имеет только субъект-службу в Microsoft Entra ID, а не регистрацию приложения.)
Найдите конечную точку токенов платформы
Платформа предоставляет локальную конечную точку токенов после подключения удостоверения:
http://169.254.169.254/metadata/identity/oauth2/token с заголовком Metadata: true и api-version=2018-02-01.IDENTITY_ENDPOINT с заголовком X-IDENTITY-HEADER, установленным в значение IDENTITY_HEADER, и api-version=2019-08-01. IMDS недоступен на этих платформах.Если у ресурса более одного назначаемого пользователем управляемого удостоверения, добавьте client_id=<IDENTITY_CLIENT_ID> к запросу токена, чтобы выбрать одно из них. Azure рекомендует всегда указывать его. Без него результат зависит от того, включено ли у ресурса также назначаемое системой удостоверение: если да, запрос молча переключается на это удостоверение и затем не проходит проверку oid вашего правила федерации; если нет, запрос сразу завершается ошибкой, как только подключается второе назначаемое пользователем удостоверение.
Декодируйте образец токена
Запросите токен у конечной точки и декодируйте его полезную нагрузку, чтобы подтвердить утверждения, которым должно соответствовать ваше правило федерации. (Команду декодирования см. в разделе Устранение неполадок при неудачном обмене.) Токен v2.0 для управляемого удостоверения содержит следующие утверждения:
{
"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
}| Утверждение | Значение | Сопоставляйте это, когда |
|---|---|---|
oid | Идентификатор объекта управляемого удостоверения, идентичный sub | Вы хотите авторизовать одно конкретное управляемое удостоверение. Это значение по умолчанию; правило в разделе Настройка Anthropic сопоставляется с ним. |
azp | Идентификатор клиента вызывающего удостоверения | Вы хотите авторизовать каждую рабочую нагрузку, использующую одну регистрацию приложения. Для управляемого удостоверения azp уникален для этого удостоверения, поэтому он эквивалентен oid. |
aud | Идентификатор клиента регистрации приложения аудитории (GUID <APP_ID> из раздела Регистрация аудитории токена) | Всегда. Поле audience правила должно точно совпадать со значением aud токена. |
tid | Идентификатор вашего арендатора | Вы хотите глубокоэшелонированную защиту. URL издателя уже фиксирует арендатора. |
Если утверждение ver декодированного токена равно 1.0, имена и значения утверждений отличаются. См. Если ваши токены имеют версию v1.0, прежде чем продолжить.
В Claude Console откройте Settings → Workload identity, нажмите Connect workload и выберите плитку Microsoft Entra. Мастер проведёт вас через регистрацию издателя, создание сервисного аккаунта и создание правила федерации.
Мастер создаёт эти ресурсы за вас. Используйте следующие значения независимо от того, вводите ли вы их в мастере или отправляете в Admin API:
Издатель федерации: Выберите v2.0 (login.microsoftonline.com) в селекторе Token issuer мастера. (Селектор по умолчанию установлен на v1; это значение по умолчанию существует для арендаторов, повторно использующих старые регистрации, которые всё ещё выдают токены v1.0.) Entra публикует документ обнаружения OIDC по URL издателя для каждого арендатора, поэтому используйте режим обнаружения. Каждому арендатору Microsoft Entra, который вы федерируете, нужна собственная запись издателя.
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks": { "type": "discovery" },
"max_jwt_lifetime_seconds": 86400
}Рабочим нагрузкам с управляемым удостоверением требуется max_jwt_lifetime_seconds: 86400. Azure выдаёт токены управляемого удостоверения с интервалом до 24 часов между iat и exp, потому что кэширует токен каждого ресурса на это окно и не предоставляет способа принудительного досрочного обновления, а значение по умолчанию издателя в 1 час отклоняет такие токены с ошибкой invalid_grant. Плитка Microsoft Entra мастера Connect workload создаёт издателя с max_jwt_lifetime_seconds, установленным в 7500, и не предоставляет поля для его изменения во время создания, поэтому завершите работу мастера, затем откройте Settings → Workload identity → Issuers, отредактируйте издателя и увеличьте значение до 86400. Вы также можете обновить издателя через Admin API.
Более длительный принимаемый срок действия означает, что утёкший токен Entra остаётся обмениваемым дольше. Если токен утёк, рычагом является отключение правила федерации; строгое сопоставление oid изначально ограничивает, какие удостоверения могут обменять токен, как описано в разделе Ограничение области действия правила.
Правило федерации: Сопоставляйте по идентификатору объекта управляемого удостоверения и идентификатору вашего арендатора. Для токенов v2.0, которые настраивает это руководство, значение audience — это идентификатор клиента регистрации приложения аудитории (GUID <APP_ID> из раздела Регистрация аудитории токена). Используйте точное значение aud из вашего декодированного токена.
{
"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 — это срок действия токена доступа Anthropic, возвращаемого обменом, а не токена Entra; SDK обновляет его за вас.
Во время выполнения ваша рабочая нагрузка получает свой токен Entra, обменивает его на POST /v1/oauth/token и использует возвращённый bearer-токен для вызова Claude. Каждый SDK Anthropic обрабатывает обмен и цикл обновления, когда вы предоставляете вызываемый объект-поставщик токенов, как показано в следующих примерах. Вкладка cURL показывает необработанный поток.
Примеры получают токен управляемого удостоверения из конечной точки токенов платформы: IMDS на VM и VM Scale Sets или служба IDENTITY_ENDPOINT на App Service, Functions и Container Apps. Замените <APP_ID> в значении ресурса api://<APP_ID> на идентификатор клиента регистрации приложения аудитории из раздела Регистрация аудитории токена.
Если ваша рабочая нагрузка уже использует клиентскую библиотеку Azure Identity, передайте её механизм получения токенов (DefaultAzureCredential с областью api://<APP_ID>/.default) в качестве поставщика токена удостоверения вместо прямого вызова конечных точек токенов. Библиотека выбирает правильную конечную точку на каждой платформе Azure, включая AKS с Entra Workload Identity.
import os
import anthropic
import requests
from anthropic import WorkloadIdentityCredentials
# URI идентификатора регистрации приложения-аудитории (см. «Регистрация аудитории токена»).
AUDIENCE = "api://<APP_ID>"
def fetch_entra_token() -> str:
"""Fetch a managed identity token from the platform's token endpoint."""
# При нескольких назначаемых пользователем удостоверениях добавьте client_id=<IDENTITY_CLIENT_ID>
# в параметры запроса, чтобы выбрать одно из них.
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:
# Виртуальная машина или масштабируемый набор ВМ: 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"))С вашего ресурса Azure выполните обмен cURL, показанный в разделе Получение и использование токена, и убедитесь, что POST /v1/oauth/token возвращает 200 с access_token, начинающимся с sk-ant-oat01-, и значением expires_in в секундах. При 400 invalid_grant декодируйте токен Entra (команду см. в разделе Устранение неполадок при неудачном обмене) и проверьте наиболее распространённые причины со стороны Azure:
issuer_url должен точно совпадать с утверждением iss токена. Токен v2.0 содержит https://login.microsoftonline.com/<TENANT_ID>/v2.0; если декодированное утверждение ver равно 1.0, см. Если ваши токены имеют версию v1.0.iat и exp. Если у издателя всё ещё установлено значение мастера 7500 (или значение по умолчанию в 1 час), увеличьте max_jwt_lifetime_seconds до 86400, как описано в разделе Настройка Anthropic.audience правила должен точно совпадать с aud токена: идентификатор клиента регистрации приложения аудитории для токенов v2.0, которые настраивает это руководство.appid, а не в azp; см. Если ваши токены имеют версию v1.0.Используйте этот путь, когда ваша рабочая нагрузка выполняется в поде AKS. Entra Workload Identity федерирует сервисный аккаунт Kubernetes с назначаемым пользователем управляемым удостоверением: Kubernetes проецирует токен сервисного аккаунта (подписанный издателем OIDC кластера AKS) в под по пути, указанному в AZURE_FEDERATED_TOKEN_FILE. Этот проецируемый токен не является токеном, выданным Entra, поэтому, чтобы остаться на пути через Entra, описанном на этой странице, рабочая нагрузка выполняет двухэтапный обмен: сначала она обменивает проецируемый токен на https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token (федеративный грант client_credentials) на токен доступа, выданный Entra, а затем передаёт этот токен Entra в SDK Anthropic в качестве токена удостоверения.
Поды AKS могут альтернативно пропустить обмен с Entra и предъявить проецируемый Kubernetes токен сервисного аккаунта напрямую Anthropic. Этот путь регистрирует в Anthropic издателя OIDC вашего кластера AKS вместо вашего арендатора Entra. Этот поток описан в разделе Использование WIF с Kubernetes.
Включите издателя OIDC и workload identity на вашем кластере
Включение workload identity устанавливает для вас мутирующий вебхук azure-workload-identity; развёртывайте его вручную только на кластерах, отличных от AKS. Сохраните URL издателя OIDC кластера для федеративных учётных данных, которые вы создадите на следующем шаге.
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)Создайте назначаемое пользователем управляемое удостоверение
Сохраните два значения из удостоверения: Client ID идёт в аннотацию сервисного аккаунта (и внедряется в под как AZURE_CLIENT_ID), а Object (principal) ID появляется как утверждение oid, с которым сопоставляется ваше правило федерации Anthropic.
az identity create \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--location <LOCATION>
# Указывается в аннотации сервисного аккаунта; внедряется в под как AZURE_CLIENT_ID.
IDENTITY_CLIENT_ID=$(az identity show \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--query clientId -o tsv)
# Отображается как утверждение oid, которому соответствует ваше правило федерации.
IDENTITY_OBJECT_ID=$(az identity show \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--query principalId -o tsv)Создайте аннотированный сервисный аккаунт Kubernetes
Вебхук azure-workload-identity читает аннотацию azure.workload.identity/client-id, чтобы внедрить AZURE_CLIENT_ID в под, который примеры в разделе Получение и использование токена читают из окружения.
apiVersion: v1
kind: ServiceAccount
metadata:
name: claude-inference
namespace: inference
annotations:
azure.workload.identity/client-id: <IDENTITY_CLIENT_ID>Создайте федеративные учётные данные на управляемом удостоверении
Федеративные учётные данные доверяют издателю OIDC вашего кластера для этого конкретного сервисного аккаунта. Значение --audience api://AzureADTokenExchange — это фиксированная аудитория Entra для входящих токенов сервисных аккаунтов Kubernetes; она не связана с аудиторией Claude API, которую вы зарегистрировали ранее.
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Пометьте под и установите его сервисный аккаунт
Под должен иметь метку azure.workload.identity/use: "true" и выполняться от имени аннотированного сервисного аккаунта. Затем вебхук внедряет AZURE_FEDERATED_TOKEN_FILE, AZURE_CLIENT_ID и AZURE_TENANT_ID в под. Файл по пути AZURE_FEDERATED_TOKEN_FILE содержит проецируемый Kubernetes токен сервисного аккаунта, подписанный издателем OIDC кластера 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:latestДекодируйте образец токена
Токен, который видит ваше правило федерации Anthropic, — это не проецируемый файл; это токен, выданный Entra, возвращаемый обменом client_credentials. Изнутри помеченного пода выполните шаг 1 примера cURL в разделе Получение и использование токена и декодируйте результат. Он имеет ту же структуру утверждений, что и путь с управляемым удостоверением:
{
"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 и oid — это идентификатор объекта управляемого удостоверения, aud — идентификатор клиента регистрации приложения аудитории, а azp — идентификатор клиента управляемого удостоверения (значение AZURE_CLIENT_ID). Срок действия отличается от пути с управляемым удостоверением: токены client_credentials по умолчанию имеют случайное окно от 60 до 90 минут между iat и exp, а не 24 часа.
В Claude Console откройте Settings → Workload identity, нажмите Connect workload и выберите плитку Microsoft Entra. Мастер проведёт вас через регистрацию издателя, создание сервисного аккаунта и создание правила федерации.
Мастер создаёт эти ресурсы за вас. Используйте следующие значения независимо от того, вводите ли вы их в мастере или отправляете в Admin API:
Издатель федерации: Выберите v2.0 (login.microsoftonline.com) в селекторе Token issuer мастера. (Селектор по умолчанию установлен на v1; это значение по умолчанию существует для арендаторов, повторно использующих старые регистрации, которые всё ещё выдают токены v1.0.) Entra публикует документ обнаружения OIDC по URL издателя для каждого арендатора, поэтому используйте режим обнаружения. Каждому арендатору Microsoft Entra, который вы федерируете, нужна собственная запись издателя.
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks": { "type": "discovery" },
"max_jwt_lifetime_seconds": 7500
}Плитка Microsoft Entra мастера Connect workload создаёт издателя с max_jwt_lifetime_seconds, установленным в 7500 (чуть более 2 часов), что покрывает срок действия токенов client_credentials по умолчанию от 60 до 90 минут. Политика срока действия токенов арендатора или Continuous Access Evaluation (CAE) могут продлить этот срок. Если разница между exp и iat вашего декодированного токена превышает 7500 секунд, отредактируйте издателя в Settings → Workload identity → Issuers и увеличьте max_jwt_lifetime_seconds соответственно, иначе обмены будут завершаться ошибкой invalid_grant. Если в вашем арендаторе также выполняются рабочие нагрузки с управляемым удостоверением из раздела Использование управляемого удостоверения, используйте значение 86400 из этого раздела, которое покрывает оба пути.
Более длительный принимаемый срок действия означает, что утёкший токен Entra остаётся обмениваемым дольше. Если токен утёк, рычагом является отключение правила федерации; строгое сопоставление oid изначально ограничивает, какие удостоверения могут обменять токен, как описано в разделе Ограничение области действия правила.
Правило федерации: Сопоставляйте по идентификатору объекта управляемого удостоверения и идентификатору вашего арендатора. Для токенов v2.0, которые настраивает это руководство, значение audience — это идентификатор клиента регистрации приложения аудитории (GUID <APP_ID> из раздела Регистрация аудитории токена). Используйте точное значение aud из вашего декодированного токена.
{
"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 — это срок действия токена доступа Anthropic, возвращаемого обменом, а не токена Entra; SDK обновляет его за вас.
Во время выполнения под выполняет двухэтапный обмен: он отправляет проецируемый Kubernetes токен (файл по пути AZURE_FEDERATED_TOKEN_FILE) на конечную точку токенов Entra в качестве федеративного утверждения client_credentials, а затем обменивает полученный токен доступа Entra на POST /v1/oauth/token. Каждый SDK Anthropic обрабатывает второй обмен и цикл обновления, когда вы предоставляете получение токена Entra в качестве вызываемого объекта-поставщика токенов, как показано в следующих примерах. Вкладка cURL показывает необработанный поток.
В примерах появляются два разных идентификатора клиента. <APP_ID> — это идентификатор клиента регистрации приложения аудитории из раздела Регистрация аудитории токена; область api://<APP_ID>/.default запрашивает у Entra токен, адресованный этой аудитории. $AZURE_CLIENT_ID — это идентификатор клиента управляемого удостоверения, внедряемый вебхуком, и он идентифицирует вызывающую сторону. Не подставляйте один вместо другого.
Если ваша рабочая нагрузка уже использует клиентскую библиотеку Azure Identity, передайте её механизм получения токенов (DefaultAzureCredential с областью api://<APP_ID>/.default) в качестве поставщика токена удостоверения вместо самостоятельного выполнения двухэтапного обмена. Библиотека читает те же переменные окружения AZURE_FEDERATED_TOKEN_FILE, AZURE_CLIENT_ID и AZURE_TENANT_ID и обрабатывает обмен с 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"))Изнутри помеченного пода выполните обмен cURL, показанный в разделе Получение и использование токена, и убедитесь, что POST /v1/oauth/token возвращает 200 с access_token, начинающимся с sk-ant-oat01-, и значением expires_in в секундах. При 400 invalid_grant декодируйте токен, выданный Entra, из шага 1 (команду см. в разделе Устранение неполадок при неудачном обмене) и проверьте наиболее распространённые причины со стороны Azure:
issuer_url должен точно совпадать с утверждением iss токена. Токен v2.0 содержит https://login.microsoftonline.com/<TENANT_ID>/v2.0; если декодированное утверждение ver равно 1.0, см. Если ваши токены имеют версию v1.0.client_credentials сверх 7500 секунд, увеличьте max_jwt_lifetime_seconds издателя, как описано в разделе Настройка Anthropic.audience правила должен точно совпадать с aud токена: идентификатор клиента регистрации приложения аудитории для токенов v2.0, которые настраивает это руководство.appid, а не в azp; см. Если ваши токены имеют версию v1.0.Это руководство настраивает регистрацию приложения аудитории с api.requestedAccessTokenVersion: 2, поэтому каждый показанный в нём токен имеет версию v2.0. Если вы повторно используете существующую регистрацию, в которой requestedAccessTokenVersion не задан, Entra вместо этого выдаёт токены v1.0. Декодируйте образец токена и проверьте его утверждение ver; если оно равно 1.0, меняются четыре вещи:
iss — это https://sts.windows.net/<TENANT_ID>/ вместо https://login.microsoftonline.com/<TENANT_ID>/v2.0. Зарегистрируйте URL издателя точно так, как он указан в утверждении iss вашего токена. Оба URL используют один и тот же JWKS, поэтому режим обнаружения работает для любого из них.aud — это URI идентификатора, который вы передали как resource (например, api://<APP_ID>), а не идентификатор клиента регистрации. Установите audience правила федерации в точное значение aud из вашего декодированного токена.appid, а не в azp. Эти два утверждения никогда не появляются в одном токене, поэтому правило, сопоставляющееся с azp, никогда не проходит для токена v1.0.Утверждения oid, sub и tid содержат одинаковые значения в обеих версиях, поэтому остальная часть этого руководства применяется без изменений.
Правило федерации может сопоставлять субъект токена с помощью subject_prefix в дополнение к карте claims (или вместо неё); о том, как комбинируются поля, см. в разделе Семантика сопоставления правил. Значения sub Entra для этих удостоверений — это канонические GUID фиксированной длины, поэтому subject_prefix, содержащий полный 36-символьный идентификатор объекта, соответствует только этому субъекту; это свойство формата субъекта Entra, а не subject_prefix в целом.
Каждое удостоверение в вашем арендаторе может запросить токен для зарегистрированной аудитории,
поэтому audience и tid сами по себе не идентифицируют конкретную рабочую нагрузку. Правило, которое
не включает сопоставление oid (или azp/appid) или использует подстановочный знак или
частичный GUID в subject_prefix, авторизует каждое управляемое удостоверение и субъект-службу
в арендаторе.
Ограничьте блок match правила до самой узкой области, подходящей для вашего случая использования:
oid как точное значение: Установите claims.oid в полный идентификатор объекта управляемого удостоверения. subject_prefix, установленный в этот полный идентификатор объекта, эквивалентен (мастер Console устанавливает оба); никогда не используйте подстановочный знак или частичный GUID в subject_prefix, так как это соответствует большему количеству удостоверений, чем вы намереваетесь.tid для глубокоэшелонированной защиты: URL издателя уже фиксирует ваш арендатор, но добавление claims.tid защищает от дрейфа конфигурации, если запись издателя будет позже отредактирована.audience в точное значение aud из вашего декодированного токена, чтобы токены, выпущенные для других приложений, отклонялись.Was this page helpful?