Condividi tramite


Chiamare API personalizzate da un agente tramite .NET

Esistono diversi modi per chiamare API personalizzate da un agente. A seconda dello scenario, è possibile usare IDownstreamApi, MicrosoftIdentityMessageHandlero IAuthorizationHeaderProvider. Questa guida illustra i diversi approcci per chiamare le proprie API protette in tutti e tre i modi.

Per chiamare un'API da un agente, è necessario ottenere un token di accesso che l'agente può usare per autenticarsi all'API. È consigliabile usare Microsoft.Identity.Web SDK per .NET per chiamare le API Web. Questo SDK semplifica il processo di acquisizione e convalida dei token. Per altre lingue, usare Microsoft Entra agent SDK per l'ID agente.

Prerequisiti

  • Identità dell'agente con autorizzazioni appropriate per chiamare l'API di destinazione. È necessario un utente per il flusso on-behalf-of.
  • Un utente agente con autorizzazioni appropriate per chiamare l'API di destinazione.

Decidere quale approccio usare in base allo scenario

La tabella seguente consente di decidere quale approccio usare. Per la maggior parte degli scenari, è consigliabile usare IDownstreamApi.

Avvicinarsi Complessità Flessibilità Caso d'uso
IDownstreamApi Low Intermedio API REST standard con configurazione
MicrosoftIdentityMessageHandler Intermedio High HttpClient con inserimento diretto (DI) e pipeline componibile
IAuthorizationHeaderProvider High Molto alto Controllo completo sulle richieste HTTP

IDownstreamApi è il modo preferito per chiamare un'API protetta tra le tre opzioni. È altamente configurabile e richiede modifiche minime al codice. Offre anche l'acquisizione automatica dei token.

Usare IDownstreamApi quando sono necessari gli elementi elencati di seguito:

  • Si chiamano API REST standard
  • Si vuole un approccio basato sulla configurazione
  • È necessaria la serializzazione/deserializzazione automatica
  • Si vuole scrivere codice minimo

Chiama la tua API

Dopo aver determinato cosa funziona per te, procedi con la chiamata alla tua API Web personalizzata.

Avvertimento

I segreti client non devono essere usati come credenziali client negli ambienti di produzione per i progetti di identità agente a causa di rischi per la sicurezza. Usare invece metodi di autenticazione più sicuri, ad esempio le credenziali di identità federate (FIC) con identità gestite o certificati client. Questi metodi offrono una sicurezza avanzata eliminando la necessità di archiviare segreti sensibili direttamente all'interno della configurazione dell'applicazione.

  1. Installare il pacchetto NuGet necessario:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Configurare le opzioni delle credenziali dei token e le API in 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. Configurare i servizi per aggiungere il supporto dell'API downstream:

    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. Chiamare l'API protetta usando IDownstreamApi. Quando si chiama l'API, è possibile specificare l'identità dell'agente o l'identità utente dell'agente usando i WithAgentIdentity metodi o WithAgentUserIdentity . IDownstreamApi gestisce automaticamente l'acquisizione del token e collega il token di accesso alla richiesta.

    • Per WithAgentIdentity, è possibile chiamare l'API usando un token solo per app (agente autonomo) o per conto di un utente (agente interattivo).

      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);
          }
      }
      
    • Per WithAgentUserIdentity, è possibile specificare il User Principal Name (UPN) o l'Object Identity (OID) per identificare l'utente agente.

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