Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Существует несколько способов вызова пользовательских API из агента. В зависимости от вашего сценария можно использовать либо IDownstreamApi, MicrosoftIdentityMessageHandlerлибо IAuthorizationHeaderProvider. В этом руководстве описываются различные подходы к вызову собственных защищенных API всех трех способов.
Чтобы вызвать API из агента, необходимо получить маркер доступа, который агент может использовать для проверки подлинности в API. Мы рекомендуем использовать Microsoft.Identity.Web SDK для вызова ваших веб-API в .NET. Этот пакет SDK упрощает процесс получения и проверки маркеров. Для других языков используйте пакет SDK аутентификации Microsoft Entra ID (sidecar).
Необходимые условия
- Удостоверение агента с соответствующими разрешениями для вызова целевого API. Вам нужен пользователь для потока от имени.
- Учетная запись пользователя агента с соответствующими разрешениями для вызова целевого API.
Определите, какой подход следует использовать в зависимости от вашего сценария
В следующей таблице показано, какой подход следует использовать. Для большинства сценариев рекомендуется использовать IDownstreamApi.
| Подход | Сложность | Гибкость | Вариант использования |
|---|---|---|---|
IDownstreamApi |
Низкий | Средний | стандартный REST API с конфигурацией |
MicrosoftIdentityMessageHandler |
Средний | Высокий | HttpClient с прямой внедрением (DI) и компонуемым конвейером |
IAuthorizationHeaderProvider |
Высокий | Очень высокий | Полный контроль над HTTP-запросами |
- Использование IDownstreamApi
- Использование MicrosoftIdentityMessageHandler
- Используйте IAuthorizationHeaderProvider
IDownstreamApi — предпочтительный способ вызова защищенного API среди трех вариантов. Он очень настраивается и требует минимальных изменений кода. Он также предлагает автоматическое получение маркеров.
Используйте, IDownstreamApi если вам нужны следующие перечисленные элементы:
- Вы вызываете стандартные REST API
- Вам нужен ориентированный на конфигурацию подход
- Требуется автоматическая сериализация и десериализация
- Вы хотите написать минимальный код
Вызовите ваш API
После определения того, что работает для вас, перейдите к вызову пользовательского веб-API.
Предупреждение
Секреты клиента не должны использоваться в качестве учетных данных клиента в рабочих средах для схем удостоверений агента из-за рисков безопасности. Вместо этого используйте более безопасные методы проверки подлинности, такие как учетные данные федеративной идентификации (FIC) с управляемыми идентификациями или клиентские сертификаты. Эти методы обеспечивают повышенную безопасность, устраняя необходимость хранения конфиденциальных секретов непосредственно в конфигурации приложения.
- Использование IDownstreamApi
- Использование MicrosoftIdentityMessageHandler
- Используйте IAuthorizationHeaderProvider
Установите необходимый пакет NuGet:
dotnet add package Microsoft.Identity.Web.DownstreamApi dotnet add package Microsoft.Identity.Web.AgentIdentitiesНастройте параметры учетных данных токена и ваши API в appsettings.json.
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "your-tenant-id", "ClientId": "your-blueprint-id", "ClientCredentials": [ { "SourceType": "ClientSecret", "ClientSecret": "your-client-secret" } ] }, "DownstreamApis": { "MyApi": { "BaseUrl": "https://api.example.com", "Scopes": ["api://my-api-client-id/read", "api://my-api-client-id/write"], "RelativePath": "/api/v1", "RequestAppToken": false } } }Настройте службы для добавления поддержки нижестоящего API:
using Microsoft.Identity.Web; var builder = WebApplication.CreateBuilder(args); // Add authentication builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches(); // Register downstream APIs builder.Services.AddDownstreamApis( builder.Configuration.GetSection("DownstreamApis")); // Add Agent Identities support builder.Services.AddAgentIdentities(); builder.Services.AddControllersWithViews(); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();Вызов защищенного API с помощью
IDownstreamApi. При вызове API можно указать удостоверение агента или удостоверение агентского аккаунта пользователя, используя методыWithAgentIdentityилиWithAgentUserIdentity.IDownstreamApiавтоматически обрабатывает получение токена и присоединяет токен доступа к запросу.Для
WithAgentIdentityвы вызываете API, используя только токен приложения (автономный агент) или от имени пользователя (интерактивный агент).using Microsoft.Identity.Abstractions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; [Authorize] public class ProductsController : Controller { private readonly IDownstreamApi _api; public ProductsController(IDownstreamApi api) { _api = api; } // GET request for app only token scenario for agent identity public async Task<IActionResult> Index() { string agentIdentity = "<your-agent-identity>"; var products = await _api.GetForAppAsync<List<Product>>( "MyApi", "products", options => options.WithAgentIdentity(agentIdentity)); return View(products); } // GET request for on-behalf of user token scenario for agent identity public async Task<IActionResult> UserProducts() { string agentIdentity = "<your-agent-identity>"; var products = await _api.GetForUserAsync<List<Product>>( "MyApi", "products", options => options.WithAgentIdentity(agentIdentity)); return View(products); } }Для
WithAgentUserIdentityэтого можно указать основное имя пользователя (UPN) или идентификатор объекта (OID), чтобы определить учетную запись пользователя агента.using Microsoft.Identity.Abstractions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; [Authorize] public class ProductsController : Controller { private readonly IDownstreamApi _api; public ProductsController(IDownstreamApi api) { _api = api; } // GET request for agent's user account identity using UPN public async Task<IActionResult> Index() { string agentIdentity = "<your-agent-identity>"; string userUpn = "user@contoso.com"; var products = await _api.GetForUserAsync<List<Product>>( "MyApi", "products", options => options.WithAgentUserIdentity(agentIdentity, userUpn)); return View(products); } // GET request for agent's user account identity using OID public async Task<IActionResult> UserProducts() { string agentIdentity = "<your-agent-identity>"; string userOid = "user-object-id"; var products = await _api.GetForUserAsync<List<Product>>( "MyApi", "products", options => options.WithAgentUserIdentity(agentIdentity, userOid)); return View(products); } }