Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
Instale el paquete NuGet necesario:
dotnet add package Microsoft.Identity.Web.DownstreamApi dotnet add package Microsoft.Identity.Web.AgentIdentitiesConfigure 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 } } }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();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 losWithAgentIdentitymétodos oWithAgentUserIdentity.IDownstreamApicontrola 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); } }