.NET kullanarak bir aracıdan özel API'leri çağırma

Bir aracıdan özel API'leri çağırmanın birden çok yolu vardır. Senaryonuza bağlı olarak , IDownstreamApiveya MicrosoftIdentityMessageHandlerkullanabilirsinizIAuthorizationHeaderProvider. Bu kılavuzda, kendi korumalı API'lerinizi çağırmak için üç yöntemin tümüne yönelik farklı yaklaşımlar açıklanmaktadır.

Bir aracıdan API çağırmak için, aracının API'de kimliğini doğrulamak için kullanabileceği bir erişim belirteci almanız gerekir. Microsoft.Identity.Web SDK'sını .NET için web API'lerinizi çağırmak üzere kullanmanızı öneririz. Bu SDK, belirteçleri alma ve doğrulama işlemini basitleştirir. Diğer diller için, aracı kimliği için Microsoft Entra aracı SDK'sını kullanın.

Önkoşullar

  • Hedef API'yi çağırmak için uygun izinlere sahip bir aracı kimliği. Akış adına işlem için bir kullanıcıya ihtiyacınız vardır.
  • Hedef API’yi çağırmak için uygun izinlere sahip bir ajanın kullanıcı hesabı.

Senaryonuza göre hangi yaklaşımı kullanacağınıza karar verin

Aşağıdaki tablo, hangi yaklaşımı kullanacağınıza karar vermenize yardımcı olur. Çoğu senaryo için kullanmanızı IDownstreamApiöneririz.

Yaklaşım Karmaşıklık Esneklik Kullanım Örneği
IDownstreamApi Low Orta Yapılandırma ile standart REST API'leri
MicrosoftIdentityMessageHandler Orta Yüksek Doğrudan Ekleme (DI) ve birleştirilebilir işlem hattı ile HttpClient
IAuthorizationHeaderProvider Yüksek Çok Yüksek HTTP istekleri üzerinde tam denetim

IDownstreamApi , üç seçenek arasında korumalı API çağırmanın tercih edilen yoludur. Yüksek oranda yapılandırılabilir ve en az kod değişikliği gerektirir. Ayrıca otomatik jeton alımı da sunar.

Aşağıdaki listelenen öğelere ihtiyacınız olduğunda kullanın IDownstreamApi :

  • Standart REST API'lerini çağırıyorsunuz
  • Yapılandırma temelli bir yaklaşım istiyorsunuz
  • Otomatik serileştirme ve seri durumdan çıkarma ihtiyacınız var.
  • En az kod yazmak istiyorsunuz

API'nizi çağırma

Sizin için neyin işe yaradığını belirledikten sonra özel web API'nizi çağırmaya devam edin.

Uyarı

Güvenlik risklerinden dolayı istemci sırları, ajan kimlik planları için üretim ortamlarında istemci kimlik bilgileri olarak kullanılmamalıdır. Bunun yerine, yönetilen kimliklerle veya istemci sertifikalarıyla federasyon kimlik bilgileri (FIC) gibi daha güvenli kimlik doğrulama yöntemleri kullanın. Bu yöntemler, hassas gizli dizileri doğrudan uygulama yapılandırmanızda depolama gereksinimini ortadan kaldırarak gelişmiş güvenlik sağlar.

  1. Gerekli NuGet paketini yükleyin:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. appsettings.json'de belirteç kimlik bilgisi seçeneklerini ve API'lerinizi yapılandırın.

    {
      "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. Aşağı akış API desteği eklemek için hizmetlerinizi yapılandırın:

    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. Korumalı API'nizi kullanarak IDownstreamApi çağırın. API'yi çağırırken WithAgentIdentity veya WithAgentUserIdentity yöntemlerinden birini kullanarak aracı kimliğini veya kullanıcının hesap kimliğini belirtebilirsiniz. IDownstreamApi belirteç alma işlemini otomatik olarak işler ve erişim belirtecini isteğe ekler.

    • WithAgentIdentity için, API'yi ya yalnızca bir uygulama belirteci (otonom ajan) kullanarak ya da bir kullanıcı adına (etkileşimli ajan) çağırırsınız.

      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);
          }
      }
      
    • için WithAgentUserIdentity, aracının kullanıcı hesabını tanımlamak için Kullanıcı Asıl Adı (UPN) veya Nesne Kimliği (OID) belirtebilirsiniz.

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