Freigeben über


Erwerben von Benutzertoken für interaktive Agents

Nachdem ein interaktiver Agent die Benutzerautorisierung erhalten hat, muss er Zugriffstoken anfordern, die zum Aufrufen von APIs im Namen des Benutzers verwendet werden können. Dieser Artikel führt Sie durch die Implementierung des On-Behalf-Of (OBO) Flusses, um delegierte Zugriffstoken für Ihren interaktiven Agenten abzurufen.

Der OBO-Fluss ermöglicht eine Web-API:

  • Empfangen eines Zugriffstokens von einem Client.
  • Tauschen Sie es gegen ein neues Zugriffstoken für eine nachgelagerte API wie Microsoft Graph aus.
  • Verwenden Sie dieses neue Token, um im Namen des ursprünglichen Benutzers auf geschützte Ressourcen zuzugreifen.

Voraussetzungen

Stellen Sie vor dem Anfordern von Benutzertoken folgendes sicher:

Anfordern von Benutzertoken

Sie können den OBO-Fluss zwar manuell mithilfe des Protokolls implementieren, wir empfehlen jedoch die Verwendung der Microsoft.Identity.Web Bibliothek, die die Implementierung vereinfacht.

  1. Installieren Sie das erforderliche NuGet-Paket:

    dotnet add package Microsoft.Identity.Web
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Aktualisieren Sie in Ihrem ASP.NET Kernweb-API-Projekt die Microsoft Entra ID-Authentifizierungsimplementierung.

    // Program.cs
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.Identity.Abstractions;
    using Microsoft.Identity.Web;
    using Microsoft.Identity.Web.Resource;
    using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // With Microsoft.Identity.Web
    builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
        .EnableTokenAcquisitionToCallDownstreamApi();
    builder.Services.AddAgentIdentities();
    builder.Services.AddInMemoryTokenCaches();
    
    var app = builder.Build();
    
    app.UseAuthentication();
    app.UseAuthorization();
    
    app.Run();
    
  3. Tauschen Sie in der Agent-API das eingehende Zugriffstoken für ein neues Zugriffstoken für die Agentidentität aus. Microsoft.Identity.Web übernimmt die Überprüfung des eingehenden Zugriffstokens, wurde jedoch derzeit nicht aktualisiert, um den On-Behalf-Of-Token-Austausch zu verarbeiten.

    app.MapGet("/agent-obo-user", async (HttpContext httpContext) =>
    {
       string agentid = "<your-agent-identity>";
        // Get the service to call the downstream API (preconfigured in the appsettings.json file)
        IAuthorizationHeaderProvider authorizationHeaderProvider = httpContext.RequestServices.GetService<IAuthorizationHeaderProvider>()!;
        AuthorizationHeaderProviderOptions options = new AuthorizationHeaderProviderOptions().WithAgentIdentity(agentid);
    
        // Request user token for the agent identity
        string authorizationHeaderWithUserToken = await authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(["https://graph.microsoft.com/.default"], options);
    
        var response = new { header = authorizationHeaderWithUserToken };
        return Results.Json(response);
    })
    .RequireAuthorization();
    

Verwenden des Microsoft Graph SDK

Wenn Sie das Microsoft Graph SDK verwenden, können Sie sich mit GraphServiceClient bei Microsoft Graph authentifizieren.

  1. Installieren Sie den *Microsoft.Identity.Web.GraphServiceClient, der die Authentifizierung für das Graph SDK verarbeitet

    dotnet add package Microsoft.Identity.Web.GraphServiceClient
    
  2. Fügen Sie in Ihrem ASP.NET Kernweb-API-Projekt die Unterstützung für Microsoft Graph in Ihrer Dienstsammlung hinzu.

    services.AddMicrosoftGraph();
    
  3. Holen Sie sich ein GraphServiceClient vom Dienstanbieter und rufen Sie Microsoft Graph-APIs mit der Agentidentität auf.

    app.MapGet("/agent-obo-user", async (HttpContext httpContext) =>
    {
    
        string agentIdentity = "<your-agent-identity>";
        builder.Services.AddMicrosoftGraph();
    
        GraphServiceClient graphServiceClient = httpContext.RequestServices.GetService<GraphServiceClient>()!;
        var me = await graphServiceClient.Me.GetAsync(r => r.Options.WithAuthenticationOptions(
            o =>
            {
                o.WithAgentIdentity(agentIdentity);
            }));
        return me.UserPrincipalName;
    })