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 Microsoft.Identity.Web SDK para llamar a sus API web en .NET. Este SDK simplifica el proceso de adquisición y validación de tokens. Para otros idiomas, use el SDK de Microsoft Entra para el ID 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.
- Una cuenta de 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 |
Bajo | Medio | API REST estándar con configuración |
MicrosoftIdentityMessageHandler |
Medio | Alto | HttpClient con inyección directa (DI) y canalización compuesta |
IAuthorizationHeaderProvider |
Alto | 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 la cuenta 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 la cuenta de 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'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); } }