Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Existem várias formas de chamar APIs personalizadas a partir de um agente. Dependendo do seu cenário, pode usar tanto IDownstreamApi, MicrosoftIdentityMessageHandler, como IAuthorizationHeaderProvider. Este guia explica as diferentes abordagens para chamar as suas próprias APIs protegidas de três formas.
Para chamar uma API a partir de um agente, é necessário obter um token de acesso que o agente possa usar para se autenticar à API. Recomendamos usar o Microsoft.Identity.Web SDK para .NET para chamar as suas APIs web. Este SDK simplifica o processo de aquisição e validação de tokens. Para outros idiomas, use o Microsoft Entra agent SDK para ID do agente.
Pré-requisitos
- Uma identidade de agente com permissões apropriadas para chamar a API de destino. Precisas de um utilizador para o fluxo em nome dele.
- A conta de utilizador de um agente com permissões apropriadas para chamar a API de destino.
Decida qual abordagem usar com base no seu cenário
A tabela seguinte ajuda-o a decidir qual a abordagem a usar. Para a maioria dos cenários, recomendamos usar IDownstreamApi.
| Abordagem | Complexidade | Flexibilidade | Caso de uso |
|---|---|---|---|
IDownstreamApi |
Baixo | Medium | APIs REST padrão com configuração |
MicrosoftIdentityMessageHandler |
Medium | Alto | HttpClient com Injeção Direta (DI) e pipeline componível |
IAuthorizationHeaderProvider |
Alto | Muito alto | Controlo total sobre pedidos HTTP |
IDownstreamApi é a forma preferida de chamar uma API protegida entre as três opções. É altamente configurável e requer alterações mínimas no código. Também oferece aquisição automática de tokens.
Use IDownstreamApi quando precisar dos seguintes itens listados:
- Estás a chamar APIs REST padrão
- Queres uma abordagem orientada pela configuração
- Precisa de serialização e desserialização automáticas
- Queres escrever código mínimo
Chame a sua API
Depois de determinar o que funciona para si, proceda a ligar para a sua API web personalizada.
Advertência
Os segredos do cliente não devem ser usados como credenciais do cliente em ambientes de produção para modelos de identidade de agentes por motivos de segurança. Em vez disso, utilize métodos de autenticação mais seguros, como credenciais de identidade federada (FIC) com identidades geridas ou certificados de cliente. Estes métodos proporcionam maior segurança ao eliminar a necessidade de armazenar segredos sensíveis diretamente na configuração da sua aplicação.
Instale o pacote NuGet necessário:
dotnet add package Microsoft.Identity.Web.DownstreamApi dotnet add package Microsoft.Identity.Web.AgentIdentitiesConfigure as opções de credencial do token e as suas APIs em 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 os seus serviços para adicionar suporte a API a jusante:
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();Chame a sua API protegida usando
IDownstreamApi. Ao chamar a API, pode especificar a identidade do agente ou a identidade da conta de utilizador do agente usando os métodosWithAgentIdentityouWithAgentUserIdentity.IDownstreamApitrata automaticamente da aquisição do token e anexa o token de acesso ao pedido.Para
WithAgentIdentity, ou chama a API usando um token exclusivo de aplicação (agente autónomo) ou em nome de um utilizador (agente interativo).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, pode especificar um Nome Principal de Utilizador (UPN) ou uma Identidade de Objeto (OID) para identificar a conta de utilizador do 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); } }