Вызов пользовательских API из агента с помощью .NET

Существует несколько способов вызова пользовательских 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 — предпочтительный способ вызова защищенного API среди трех вариантов. Он очень настраивается и требует минимальных изменений кода. Он также предлагает автоматическое получение маркеров.

Используйте, IDownstreamApi если вам нужны следующие перечисленные элементы:

  • Вы вызываете стандартные REST API
  • Вам нужен ориентированный на конфигурацию подход
  • Требуется автоматическая сериализация и десериализация
  • Вы хотите написать минимальный код

Вызовите ваш API

После определения того, что работает для вас, перейдите к вызову пользовательского веб-API.

Предупреждение

Секреты клиента не должны использоваться в качестве учетных данных клиента в рабочих средах для схем удостоверений агента из-за рисков безопасности. Вместо этого используйте более безопасные методы проверки подлинности, такие как учетные данные федеративной идентификации (FIC) с управляемыми идентификациями или клиентские сертификаты. Эти методы обеспечивают повышенную безопасность, устраняя необходимость хранения конфиденциальных секретов непосредственно в конфигурации приложения.

  1. Установите необходимый пакет NuGet:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Настройте параметры учетных данных токена и ваши 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
        }
      }
    }
    
  3. Настройте службы для добавления поддержки нижестоящего 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();
    
  4. Вызов защищенного 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);
          }
      
      }