Compartir a través de


Llamar a APIs personalizadas desde un agente mediante .NET

Hay varias maneras de llamar a las API personalizadas desde un agente. En función de su escenario, puede usar IDownstreamApi, MicrosoftIdentityMessageHandlero IAuthorizationHeaderProvider. En esta guía se explican los distintos enfoques para llamar a sus propias API protegidas de las tres maneras.

Para llamar a una API desde un agente, debe obtener un token de acceso que el agente puede usar para autenticarse en la API. Se recomienda usar el SDK de Microsoft.Identity.Web para .NET para llamar a las API web. Este SDK simplifica el proceso de adquisición y validación de tokens. Para otros lenguajes, use el SDK del agente de Microsoft Entra para el identificador del agente.

Prerrequisitos

  • Una identidad del agente con los permisos adecuados para llamar a la API de destino. Necesita un usuario para el flujo de representación.
  • Un usuario del agente con los permisos adecuados para llamar a la API de destino.

Decidir qué enfoque usar en función de su escenario

La tabla siguiente le ayuda a decidir qué enfoque usar. Para la mayoría de los escenarios, se recomienda usar IDownstreamApi.

Enfoque Complejidad Flexibilidad Caso de uso
IDownstreamApi Low Mediana API REST estándar con configuración
MicrosoftIdentityMessageHandler Mediana High HttpClient con inyección directa (DI) y canalización compuesta
IAuthorizationHeaderProvider High Muy alto Control completo de las solicitudes HTTP

IDownstreamApi es la manera preferida de llamar a una API protegida entre las tres opciones. Es muy configurable y requiere cambios mínimos de código. También ofrece la adquisición automática de tokens.

Use IDownstreamApi cuando necesite los siguientes elementos enumerados:

  • Está llamando a las API REST estándar.
  • Quiere un enfoque basado en la configuración.
  • Necesita serialización y deserialización automáticas.
  • Quiere escribir código mínimo

Llamada a la API

Después de determinar qué funciona para ti, proceda con la llamada a la API web personalizada.

Advertencia

Los secretos de cliente no se deben usar como credenciales de cliente en entornos de producción para planos técnicos de identidad del agente debido a riesgos de seguridad. En su lugar, use métodos de autenticación más seguros, como credenciales de identidad federada (FIC) con identidades administradas o certificados de cliente. Estos métodos proporcionan seguridad mejorada eliminando la necesidad de almacenar secretos confidenciales directamente dentro de la configuración de la aplicación.

  1. Instale el paquete NuGet necesario:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Configure las opciones de credenciales de token y las API en 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. Configure los servicios para agregar compatibilidad con la API de bajada:

    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. Llame a la API protegida mediante IDownstreamApi. Al llamar a la API, puede especificar la identidad del agente o la identidad de usuario del agente mediante los WithAgentIdentity métodos o WithAgentUserIdentity . IDownstreamApi controla automáticamente la adquisición de tokens y adjunta el token de acceso a la solicitud.

    • Para WithAgentIdentity, puede llamar a la API mediante un token de aplicación (agente autónomo) o en nombre de un usuario (agente interactivo).

      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);
          }
      }
      
    • Para WithAgentUserIdentity, puede especificar el nombre principal de usuario (UPN) o la identidad de objeto (OID) para identificar al usuario del 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);
          }
      
      }