Freigeben über


Aufrufen von benutzerdefinierten APIs von einem Agent mithilfe von .NET

Es gibt mehrere Möglichkeiten, benutzerdefinierte APIs von einem Agent aufzurufen. Abhängig von Ihrem Szenario können Sie entweder IDownstreamApi, MicrosoftIdentityMessageHandler oder IAuthorizationHeaderProvider. In diesem Leitfaden werden die verschiedenen Ansätze zum Aufrufen ihrer eigenen geschützten APIs auf alle drei Arten erläutert.

Um eine API von einem Agent aufzurufen, müssen Sie ein Zugriffstoken abrufen, das der Agent verwenden kann, um sich selbst bei der API zu authentifizieren. Wir empfehlen die Verwendung des Microsoft.Identity.Web SDK für .NET zum Aufrufen Ihrer Web-APIs. Dieses SDK vereinfacht den Prozess des Abrufens und Validierens von Token. Verwenden Sie für andere Sprachen das Microsoft Entra-Agent-SDK für die Agent-ID.

Voraussetzungen

  • Eine Agentidentität mit entsprechenden Berechtigungen zum Aufrufen der Ziel-API. Sie benötigen einen Benutzer für den On-Behalf-of-Flow.
  • Ein Agentbenutzer mit entsprechenden Berechtigungen zum Aufrufen der Ziel-API.

Entscheiden, welcher Ansatz basierend auf Ihrem Szenario verwendet werden soll

In der folgenden Tabelle können Sie entscheiden, welcher Ansatz verwendet werden soll. Für die meisten Szenarien empfehlen wir die Verwendung IDownstreamApi.

Vorgehensweise Kompliziertheit Flexibilität Anwendungsfall
IDownstreamApi Low Mittelstufe Standard-REST-APIs mit Konfiguration
MicrosoftIdentityMessageHandler Mittelstufe High HttpClient mit Direct Injection (DI) und composable Pipeline
IAuthorizationHeaderProvider High Sehr hoch Vollständige Kontrolle über HTTP-Anforderungen

IDownstreamApi ist die bevorzugte Methode zum Aufrufen einer geschützten API zwischen den drei Optionen. Es ist sehr konfigurierbar und erfordert minimale Codeänderungen. Es bietet auch die automatische Token-Erfassung.

Verwenden Sie IDownstreamApi, wenn Sie die folgenden Elemente benötigen:

  • Sie rufen standardmäßige REST-APIs auf
  • Sie möchten einen konfigurationsgesteuerten Ansatz
  • Sie benötigen die automatische Serialisierung/Deserialisierung.
  • Sie möchten minimalen Code schreiben

Aufrufen Ihrer API

Nachdem Sie ermittelt haben, was für Sie funktioniert, rufen Sie ihre benutzerdefinierte Web-API auf.

Warnung

Geheime Clientschlüssel sollten aufgrund von Sicherheitsrisiken nicht als Clientanmeldeinformationen in Produktionsumgebungen für Agentidentitäts-Blueprints verwendet werden. Verwenden Sie stattdessen sicherere Authentifizierungsmethoden wie Verbundidentitätsanmeldeinformationen (FIC) mit verwalteten Identitäten oder Clientzertifikaten. Diese Methoden bieten eine verbesserte Sicherheit, da vertrauliche geheime Schlüssel nicht direkt in Ihrer Anwendungskonfiguration gespeichert werden müssen.

  1. Installieren Sie das erforderliche NuGet-Paket:

    dotnet add package Microsoft.Identity.Web.DownstreamApi
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Konfigurieren Sie tokenanmeldeinformationsoptionen und Ihre APIs 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
        }
      }
    }
    
  3. Konfigurieren Sie Ihre Dienste, um nachgeschaltete API-Unterstützung hinzuzufügen:

    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. Rufen Sie Ihre geschützte API mithilfe von IDownstreamApi. Beim Aufrufen der API können Sie die Agent-Identität oder die Agent-Benutzeridentität mithilfe der WithAgentIdentity oder WithAgentUserIdentity Methoden angeben. IDownstreamApi verarbeitet automatisch die Tokenerfassung und fügt das Zugriffstoken an die Anforderung an.

    • Sie können für WithAgentIdentity die API entweder mit einem nur für App Token (autonomer Agent) oder im Auftrag eines Benutzers (interaktiver Agent) aufrufen.

      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);
          }
      }
      
    • Für WithAgentUserIdentitydiese Eigenschaft können Sie entweder den Benutzerprinzipalnamen (User Principal Name, UPN) oder die Objektidentität (Object Identity, OID) angeben, um den Agentbenutzer zu identifizieren.

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