Memanggil API kustom dari agen menggunakan .NET

Ada beberapa cara untuk memanggil API kustom dari agen. Bergantung pada skenario Anda, Anda dapat menggunakan IDownstreamApi, , MicrosoftIdentityMessageHandleratau IAuthorizationHeaderProvider. Panduan ini menjelaskan berbagai pendekatan untuk memanggil API yang dilindungi Anda sendiri dengan ketiga cara tersebut.

Untuk memanggil API dari agen, Anda perlu mendapatkan token akses yang dapat digunakan agen untuk mengautentikasi dirinya ke API. Sebaiknya gunakan Microsoft. Identity.Web SDK untuk .NET memanggil API web Anda. SDK ini menyederhanakan proses memperoleh dan memvalidasi token. Untuk bahasa lain, gunakan Microsoft Entra ID Auth SDK (sidecar).

Prasyarat

  • Identitas agen dengan izin yang sesuai untuk memanggil API target. Anda memerlukan pengguna untuk proses alur atas nama.
  • Akun pengguna agen dengan izin yang sesuai untuk memanggil API target.

Memutuskan pendekatan mana yang akan digunakan berdasarkan skenario Anda

Tabel berikut ini membantu Anda memutuskan pendekatan mana yang akan digunakan. Untuk sebagian besar skenario, sebaiknya gunakan IDownstreamApi.

Pendekatan Kompleksitas Fleksibilitas Kasus Penggunaan
IDownstreamApi Rendah Medium REST API standar dengan konfigurasi
MicrosoftIdentityMessageHandler Medium Tinggi HttpClient dengan Direct Injection (DI) dan alur yang dapat disusun
IAuthorizationHeaderProvider Tinggi Sangat Tinggi Kontrol penuh atas permintaan HTTP

IDownstreamApi adalah cara yang disukai untuk memanggil API yang dilindungi di antara tiga opsi. Ini sangat dapat dikonfigurasi dan memerlukan perubahan kode minimal. Ini juga menawarkan akuisisi token otomatis.

Gunakan IDownstreamApi saat Anda memerlukan item yang tercantum berikut ini:

  • Anda memanggil REST API standar
  • Anda menginginkan pendekatan berbasis konfigurasi
  • Anda memerlukan serialisasi/deserialisasi otomatis
  • Anda ingin menulis kode minimal

Memanggil API Anda

Setelah menentukan apa yang berfungsi untuk Anda, lanjutkan untuk memanggil API web kustom Anda.

Peringatan

Rahasia klien tidak boleh digunakan sebagai kredensial klien di lingkungan produksi untuk cetak biru identitas agen karena risiko keamanan. Sebagai gantinya, gunakan metode autentikasi yang lebih aman seperti kredensial identitas gabungan (FIC) dengan identitas terkelola atau sertifikat klien. Metode ini memberikan keamanan yang ditingkatkan dengan menghilangkan kebutuhan untuk menyimpan rahasia sensitif langsung dalam konfigurasi aplikasi Anda.

  1. Instal paket NuGet yang diperlukan:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Konfigurasikan opsi kredensial token dan API Anda di 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. Konfigurasikan layanan Anda untuk menambahkan dukungan API hilir:

    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    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. Panggil API terproteksi Anda menggunakan IDownstreamApi. Saat memanggil API, Anda dapat menentukan identitas agen atau identitas akun pengguna agen menggunakan WithAgentIdentity metode atau WithAgentUserIdentity . IDownstreamApi secara otomatis menangani akuisisi token dan melampirkan token akses ke permintaan.

    • Untuk WithAgentIdentity, Anda dapat memanggil API menggunakan token aplikasi saja (agen otonom) atau atas nama pengguna (agen interaktif).

      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);
          }
      }
      
    • Untuk WithAgentUserIdentity, Anda dapat menentukan Nama Prinsipal Pengguna (UPN) atau Identitas Objek (OID) untuk mengidentifikasi akun pengguna agen.

      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);
          }
      
      }