Vyvolání vlastních rozhraní API z agenta pomocí .NET

Existují různé způsoby volání vlastních rozhraní API z agenta. V závislosti na vašem scénáři můžete použít buď IDownstreamApi, MicrosoftIdentityMessageHandlernebo IAuthorizationHeaderProvider. Tato příručka vysvětluje různé přístupy pro volání vlastních chráněných rozhraní API všemi třemi způsoby.

Pokud chcete volat rozhraní API z agenta, musíte získat přístupový token, který může agent použít k ověření v rozhraní API. Doporučujeme použít Microsoft. Identity.Web SDK pro .NET pro volání webových rozhraní API Tato sada SDK zjednodušuje proces získávání a ověřování tokenů. Pro ostatní jazyky použijte sadu SDK Microsoft Entra ID Auth (sidecar).

Předpoklady

  • Identita agenta s příslušnými oprávněními pro volání cílového rozhraní API. Pro tok v zastoupení potřebujete uživatele.
  • Uživatelský účet agenta s příslušnými oprávněními pro volání cílového rozhraní API.

Rozhodněte se, který přístup se má použít v závislosti na vašem scénáři.

Následující tabulka vám pomůže rozhodnout, který přístup se má použít. Pro většinu scénářů doporučujeme použít IDownstreamApi.

Přístup Složitost Flexibilita Případ použití
IDownstreamApi Nízká úroveň Středně Standardní rozhraní REST API s konfigurací
MicrosoftIdentityMessageHandler Středně Vysoko HttpClient s přímou injekcí (DI) a složitelným kanálem
IAuthorizationHeaderProvider Vysoko Velmi vysoká Úplná kontrola nad požadavky HTTP

IDownstreamApi je upřednostňovaným způsobem volání chráněného rozhraní API mezi třemi možnostmi. Je vysoce konfigurovatelná a vyžaduje minimální změny kódu. Nabízí také automatické získávání tokenů.

Použijte IDownstreamApi , když potřebujete následující uvedené položky:

  • Voláte standardní rozhraní REST API.
  • Chcete přístup řízený konfigurací.
  • Potřebujete automatickou serializaci/deserializaci.
  • Chcete napsat minimální kód.

Zavolejte své rozhraní API

Po určení toho, co vám vyhovuje, pokračujte voláním vlastního webového rozhraní API.

Výstraha

Tajné kódy klienta by se neměly používat jako přihlašovací údaje klienta v produkčních prostředích pro podrobné plány identit agentů kvůli rizikům zabezpečení. Místo toho používejte bezpečnější metody ověřování, jako jsou přihlašovací údaje federované identity (FIC) se spravovanými identitami nebo klientskými certifikáty . Tyto metody poskytují lepší zabezpečení tím, že eliminují potřebu ukládat citlivé tajné kódy přímo v konfiguraci vaší aplikace.

  1. Nainstalujte požadovaný balíček NuGet:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Konfigurace možností přihlašovacích údajů tokenu a vašich rozhraní API v 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. Nakonfigurujte služby pro přidání podpory podřízených rozhraní API:

    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. Zavolejte své chráněné rozhraní API pomocí IDownstreamApi. Při volání rozhraní API můžete určit identitu agenta nebo identitu uživatelského účtu agenta pomocí WithAgentIdentity metod nebo WithAgentUserIdentity metod. IDownstreamApi automaticky zpracuje získání tokenu a připojí přístupový token k požadavku.

    • V případě WithAgentIdentity buď zavoláte rozhraní API pomocí tokenu pouze pro aplikaci (autonomního agenta), nebo jménem uživatele (interaktivního 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 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);
          }
      }
      
    • Pro WithAgentUserIdentityurčení uživatelského účtu agenta můžete zadat hlavní název uživatele (UPN) nebo identitu objektu (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);
          }
      
      }