Wywoływanie niestandardowych interfejsów API z agenta przy użyciu .NET

Istnieje wiele sposobów wywoływania niestandardowych interfejsów API z agenta. W zależności od scenariusza można użyć polecenia IDownstreamApi, MicrosoftIdentityMessageHandlerlub IAuthorizationHeaderProvider. W tym przewodniku wyjaśniono różne podejścia do wywoływania własnych chronionych interfejsów API na wszystkie trzy sposoby.

Aby wywołać interfejs API z agenta, należy uzyskać token dostępu, którego agent może użyć do uwierzytelnienia się w interfejsie API. Zalecamy użycie Microsoft. Identity.Web SDK for .NET do wywoływania internetowych interfejsów API. Ten zestaw SDK upraszcza proces uzyskiwania i weryfikowania tokenów. Dla innych języków użyj zestawu SDK uwierzytelniania Microsoft Entra ID (sidecar).

Wymagania wstępne

  • Tożsamość agenta z odpowiednimi uprawnieniami do wywoływania docelowego interfejsu API. Potrzebujesz użytkownika do procesu wykonywanego w imieniu innych.
  • Konto użytkownika agenta z odpowiednimi uprawnieniami do wywoływania docelowego interfejsu API.

Zdecyduj, które podejście ma być używane w zależności od scenariusza

Poniższa tabela ułatwia podjęcie decyzji o tym, które podejście ma być używane. W przypadku większości scenariuszy zalecamy użycie polecenia IDownstreamApi.

Metoda Złożoność Elastyczność Przypadek użycia
IDownstreamApi Low Średni Standardowe interfejsy API REST z konfiguracją
MicrosoftIdentityMessageHandler Średni High HttpClient z bezpośrednim wstrzyknięciem (DI) i potokiem komponowalnym
IAuthorizationHeaderProvider High Bardzo wysoka Pełna kontrola nad żądaniami HTTP

IDownstreamApi jest preferowanym sposobem wywoływania chronionego interfejsu API między trzema opcjami. Jest on wysoce konfigurowalny i wymaga minimalnych zmian w kodzie. Oferuje również automatyczne pozyskiwanie tokenów.

Użyj IDownstreamApi, gdy potrzebne są następujące elementy:

  • Wywołujesz standardowe interfejsy API REST
  • Potrzebujesz podejścia opartego na konfiguracji
  • Potrzebna jest automatyczna serializacja/deserializacja
  • Chcesz napisać minimalny kod

Wywołaj swoje API

Po określeniu, co działa dla Ciebie, przejdź do wywołania niestandardowego internetowego interfejsu API.

Ostrzeżenie

Tajne klucze klienta nie powinny być używane jako poświadczenia klienta w środowiskach produkcyjnych dla szablonów tożsamości agenta ze względu na zagrożenia bezpieczeństwa. Zamiast tego należy użyć bezpieczniejszych metod uwierzytelniania, takich jak poświadczenia tożsamości federacyjnej (FIC) z tożsamościami zarządzanymi lub certyfikatami klienta. Te metody zapewniają zwiększone zabezpieczenia, eliminując konieczność przechowywania poufnych wpisów tajnych bezpośrednio w ramach konfiguracji aplikacji.

  1. Zainstaluj wymagany pakiet NuGet:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Skonfiguruj opcje poświadczeń tokenu i interfejsy API w 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. Skonfiguruj usługi, aby dodać obsługę interfejsu API podrzędnego:

    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    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. Wywołaj chroniony interfejs API przy użyciu polecenia IDownstreamApi. Podczas wywoływania interfejsu API można określić tożsamość agenta lub tożsamość konta użytkownika agenta przy użyciu metod WithAgentIdentity lub WithAgentUserIdentity. IDownstreamApi automatycznie obsługuje pozyskiwanie tokenów i dołącza token dostępu do żądania.

    • Aby WithAgentIdentity, możesz wywołać interfejs API przy użyciu tokenu tylko dla aplikacji (agenta autonomicznego) lub w imieniu użytkownika (agenta interaktywnego).

      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);
          }
      }
      
    • W przypadku WithAgentUserIdentity można określić główną nazwę użytkownika (UPN) lub tożsamość obiektu (OID), aby zidentyfikować konto użytkownika agenta.

      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);
          }
      
      }