entra-agent-ididentity для AI-агентов в Entra
microsoft/azure-skills
Создаёт Agent Identity в Microsoft Entra: собственный service principal для каждого агента, audit trail и независимые разрешения через Microsoft Graph.
Установка
npx -y skills add microsoft/azure-skills --skill entra-agent-id --agent claude-codeMicrosoft Entra Agent ID
Создавайте и управляйте 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-контейнер) |
Когда использовать
- Создание нового Agent Identity Blueprint и BlueprintPrincipal
- Создание экземпляров Agent Identity в рамках Blueprint
- Настройка учётных данных (FIC, Managed Identity, client secret) на Blueprint
- Реализация двухшагового
fmi_pathruntime-обмена токенов (автономный или OBO) - Кросс-тенантные потоки токенов агента
- Развёртывание sidecar-а Microsoft Entra SDK for AgentID для polyglot-агентов
- Выдача прав на уровне Agent Identity (
appRoleAssignmentsилиoauth2PermissionGrants) - Диагностика ошибок:
AADSTS82001,AADSTS700211,PropertyNotCompatibleWithAgentIdentity
Концептуальная модель
Agent 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.
PowerShell (делегированный)
Connect-MgGraph -Scopes @(
"AgentIdentityBlueprint.Create",
"AgentIdentityBlueprint.ReadWrite.All",
"AgentIdentityBlueprintPrincipal.Create",
"AgentIdentity.Create.All",
"User.Read"
)
Python (приложение)
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",
}
Основной рабочий процесс
Шаг 1: Создать Agent Identity Blueprint
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"]
Шаг 2: Создать BlueprintPrincipal
Обязательно. Создание 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()
Шаг 3: Создать Agent Identity
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"]
Runtime-аутентификация
Агенты аутентифицируются через учётные данные, настроенные на 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 и двухшаговый обмен автоматически.
Выдача прав (на уровне Agent Identity)
Права приложения (автономный)
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()
Делегированные права (OBO)
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 для программного делегированного согласия.
Кросс-тенантные Agent Identities
Шаг 1 обмена родительского токена ДОЛЖЕН нацеливаться на home-тенант Agent Identity, а не Blueprint. Неверный тенант → AADSTS700211: No matching federated identity record found.
API-справочник
| Операция | Метод | Эндпоинт |
|---|---|---|
| Создать 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 основного рабочего процесса |
Лучшие практики
- Всегда создавайте BlueprintPrincipal после Blueprint — не создаётся автоматически
- Используйте типизированные эндпоинты (
/applications/microsoft.graph.agentIdentityBlueprint) - Учётные данные — только на Blueprint (Agent Identities не могут хранить секреты)
- Включайте
OData-Version: 4.0в каждый запрос к Graph - WIF для продакшна, client secrets — только для локальной разработки
- Никогда не используйте токены Azure CLI для API Agent Identity
- Используйте
fmi_pathсclient_credentials, а не RFC 8693 - Всегда используйте scope
/.defaultв обоих шагах обмена - Выдавайте права на уровне каждого Agent Identity, а не BlueprintPrincipal
- Обрабатывайте задержки распространения прав — повторяйте 403 с паузой 30–120 с
- Держите Entra SDK for AgentID на localhost — никогда не открывайте через LoadBalancer
Из того же репозитория
microsoft-foundry — полный цикл AI-агентов на Foundry
microsoft/azure-skills
Деплой, оценка и управление AI-агентами на Microsoft Foundry: контейнеризация, ACR, создание агентов, batch-оценки и оптимизация промптов по данным продакшена.
azure-ai — AI-сервисы Azure для разработчиков
microsoft/azure-skills
Инструменты Azure AI через MCP для разработчиков: AI Search, Speech, OpenAI и Document Intelligence — интеграция в приложения без управления инфраструктурой.
azure-diagnostics — диагностика проблем в Azure продакшене
microsoft/azure-skills
Систематическая отладка продакшена Azure: Container Apps, Function Apps и AKS. AppLens для root cause, KQL-запросы под конкретные ошибки и crash loops.
azure-prepare — генерация Azure-инфраструктуры
microsoft/azure-skills
Генерирует Bicep/Terraform, azure.yaml и Dockerfile для новых и существующих приложений перед деплоем в Azure. Обязательный первый шаг трёхэтапного воркфлоу.
azure-deploy — деплой подготовленных Azure-приложений
microsoft/azure-skills
Выполняет деплой приложений с готовой инфраструктурой: azd up, azd deploy с проверками и обработкой ошибок. Требует предварительной подготовки через azure-prepare.
azure-storage — хранилище Azure для разработчиков
microsoft/azure-skills
Управление Azure Storage через MCP или CLI: Blob, File Shares, Queue, Table и Data Lake. Сравнение сервисов, уровни доступа, операции с blob через MCP-инструменты.
