Создаёт Agent Identity в Microsoft Entra: собственный service principal для каждого агента, audit trail и независимые разрешения через Microsoft Graph.
npx -y skills add microsoft/azure-skills --skill entra-agent-id --agent claude-codeСоздавайте и управляйте OAuth 2.0-идентификаторами для AI-агентов через Microsoft Graph. Каждый экземпляр агента получает отдельный идентификатор, журнал аудита и независимо ограниченные права.
| Свойство | Значение |
|---|---|
| Сервис | Microsoft Entra Agent ID |
| API | Microsoft Graph (https://graph.microsoft.com/v1.0) |
| Необходимая роль | Agent Identity Developer, Agent Identity Administrator или Application Administrator |
| Объектная модель | Blueprint (приложение) → BlueprintPrincipal (SP) → Agent Identity (SP) |
| Runtime-обмен | Двухшаговый fmi_path (автономный и OBO) |
| .NET-хелпер | Microsoft.Identity.Web.AgentIdentities |
| Polyglot-хелпер | Microsoft Entra SDK for AgentID (sidecar-контейнер) |
fmi_path runtime-обмена токенов (автономный или OBO)appRoleAssignments или oauth2PermissionGrants)AADSTS82001, AADSTS700211, PropertyNotCompatibleWithAgentIdentityAgent Identity Blueprint (application) ← один на тип/проект агента
└── BlueprintPrincipal (service principal) ← ОБЯЗАТЕЛЬНО создавать явно
├── Agent Identity (SP): agent-1 ← по одному на экземпляр агента
├── Agent Identity (SP): agent-2
└── Agent Identity (SP): agent-3
| Концепция | Описание |
|---|---|
| Blueprint | Объект приложения, определяющий тип агента. Хранит учётные данные. |
| BlueprintPrincipal | Service principal для Blueprint в тенанте. Не создаётся автоматически. |
| Agent Identity | Только-SP идентификатор для одного экземпляра агента. Не может хранить учётные данные. |
| Sponsor | Пользователь (или группа для Agent Identity), ответственный за идентификатор. Обязателен при создании. |
DefaultAzureCredentialне поддерживается. Токены Azure CLI содержатDirectory.AccessAsUser.All, что жёстко отклоняется (403) API Agent Identity. Используйте выделенную регистрацию приложения сclient_credentials.
Connect-MgGraph -Scopes @(
"AgentIdentityBlueprint.Create",
"AgentIdentityBlueprint.ReadWrite.All",
"AgentIdentityBlueprintPrincipal.Create",
"AgentIdentity.Create.All",
"User.Read"
)
from azure.identity import ClientSecretCredential
import requests, os
credential = ClientSecretCredential(
tenant_id=os.environ["AZURE_TENANT_ID"],
client_id=os.environ["AZURE_CLIENT_ID"],
client_secret=os.environ["AZURE_CLIENT_SECRET"],
)
token = credential.get_token("https://graph.microsoft.com/.default")
GRAPH = "https://graph.microsoft.com/v1.0"
headers = {
"Authorization": f"Bearer {token.token}",
"Content-Type": "application/json",
"OData-Version": "4.0",
}
blueprint_body = {
"displayName": "My Agent Blueprint",
"sponsors@odata.bind": [
f"https://graph.microsoft.com/v1.0/users/{user_id}"
],
}
resp = requests.post(
f"{GRAPH}/applications/microsoft.graph.agentIdentityBlueprint",
headers=headers, json=blueprint_body,
)
resp.raise_for_status()
blueprint = resp.json()
app_id = blueprint["appId"]
Обязательно. Создание Blueprint НЕ создаёт автоматически service principal. Пропуск этого шага даёт: 400: The Agent Blueprint Principal for the Agent Blueprint does not exist.
resp = requests.post(
f"{GRAPH}/servicePrincipals/microsoft.graph.agentIdentityBlueprintPrincipal",
headers=headers, json={"appId": app_id},
)
resp.raise_for_status()
agent_body = {
"displayName": "my-agent-instance-1",
"agentIdentityBlueprintId": app_id,
"sponsors@odata.bind": [f"https://graph.microsoft.com/v1.0/users/{user_id}"],
}
resp = requests.post(
f"{GRAPH}/servicePrincipals/microsoft.graph.agentIdentity",
headers=headers, json=agent_body,
)
resp.raise_for_status()
agent_sp_id = resp.json()["id"]
Агенты аутентифицируются через учётные данные, настроенные на Blueprint (не на Agent Identity — они не могут хранить учётные данные).
| Вариант | Случай использования | Учётные данные на Blueprint |
|---|---|---|
| Managed Identity + WIF | Продакшн (Azure-hosted) | Federated Identity Credential |
| Client secret | Локальная разработка / тестирование | Password credential |
| Microsoft Entra SDK for AgentID | Polyglot / сторонние агенты | Sidecar-контейнер получает токены по HTTP |
.NET: используйте Microsoft.Identity.Web.AgentIdentities — обрабатывает FIC и двухшаговый обмен автоматически.
requests.post(
f"{GRAPH}/servicePrincipals/{agent_sp_id}/appRoleAssignments",
headers=headers,
json={
"principalId": agent_sp_id,
"resourceId": graph_sp["id"],
"appRoleId": user_read_all["id"],
},
).raise_for_status()
requests.post(
f"{GRAPH}/oauth2PermissionGrants",
headers=headers,
json={
"clientId": agent_sp_id,
"consentType": "AllPrincipals",
"resourceId": graph_sp["id"],
"scope": "User.Read Tasks.ReadWrite Mail.Send",
"expiryTime": expiry,
},
).raise_for_status()
Браузерные URL admin consent не работают для Agent Identities — используйте oauth2PermissionGrants для программного делегированного согласия.
Шаг 1 обмена родительского токена ДОЛЖЕН нацеливаться на home-тенант Agent Identity, а не Blueprint. Неверный тенант → AADSTS700211: No matching federated identity record found.
| Операция | Метод | Эндпоинт |
|---|---|---|
| Создать Blueprint | POST | /applications/microsoft.graph.agentIdentityBlueprint |
| Создать BlueprintPrincipal | POST | /servicePrincipals/microsoft.graph.agentIdentityBlueprintPrincipal |
| Создать Agent Identity | POST | /servicePrincipals/microsoft.graph.agentIdentity |
| Выдать права приложения | POST | /servicePrincipals/{id}/appRoleAssignments |
| Выдать делегированные права | POST | /oauth2PermissionGrants |
| Удалить Agent Identity | DELETE | /servicePrincipals/{id} |
| Ошибка | Причина | Решение |
|---|---|---|
AADSTS82001 | Использован RFC 8693 token-exchange grant | Используйте client_credentials с fmi_path |
AADSTS700211 | Шаг 1 нацелен на неверный тенант | Нацельтесь на home-тенант Agent Identity |
AADSTS50013 | OBO user token нацелен на Graph, а не Blueprint | Используйте api://{blueprint_app_id}/access_as_user |
PropertyNotCompatibleWithAgentIdentity | Попытка добавить учётные данные к Agent Identity SP | Учётные данные — только на Blueprint |
Agent Blueprint Principal does not exist | BlueprintPrincipal не создан | Шаг 2 основного рабочего процесса |
/applications/microsoft.graph.agentIdentityBlueprint)OData-Version: 4.0 в каждый запрос к Graphfmi_path с client_credentials, а не RFC 8693/.default в обоих шагах обмена