Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Installare il pacchetto NuGet necessario:
dotnet add package Microsoft.Identity.Web.DownstreamApi dotnet add package Microsoft.Identity.Web.AgentIdentitiesConfigurare 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 } } }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();Chiamare l'API protetta usando
IDownstreamApi. Quando si chiama l'API, è possibile specificare l'identità dell'agente o l'identità utente dell'agente usando iWithAgentIdentitymetodi oWithAgentUserIdentity.IDownstreamApigestisce 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); } }