Chamar APIs personalizadas a partir de um agente usando .NET

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.

  1. Instale o pacote NuGet necessário:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Configure 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
        }
      }
    }
    
  3. 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();
    
  4. 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étodos WithAgentIdentity ou WithAgentUserIdentity. IDownstreamApi trata 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);
          }
      
      }