Anropa Azure tjänster från din agent med hjälp av .NET Azure SDKs

Den här artikeln beskriver hur du anropar Azure tjänster från din agent. Om du vill autentisera till Azure tjänster som Azure Storage eller Azure Key Vault med hjälp av agentidentiteter använder du klassen MicrosoftIdentityTokenCredential från Microsoft. Identity.Web. Azure. Klassen MicrosoftIdentityTokenCredential implementerar Azure SDKs TokenCredential-gränssnitt, vilket möjliggör sömlös integrering mellan Microsoft. Identity.Web och Azure SDKs klienter.

Om du vill anropa ett API från en agent måste du hämta en åtkomsttoken som agenten kan använda för att autentisera sig själv till API:et. Vi rekommenderar att du använder Microsoft. Identity.Web SDK för .NET för att anropa dina webb-API:er. Det här SDK:t förenklar processen för att hämta och validera token. För andra språk använder du Microsoft Entra agent-SDK för agent-ID.

Förutsättningar

  • En agentidentitet med lämpliga behörigheter för att anropa mål-API:et. Du behöver en användare för flödet 'on-behalf-of'.
  • En agents användarkonto med rätt behörighet att anropa mål-API:et.

Implementeringssteg

  1. Installera Azure integrationspaketet och Microsoft. Identity.Web.AgentIdentities paket för att lägga till stöd för agentidentiteter.

    dotnet add package Microsoft.Identity.Web.Azure
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Installera det Azure SDKs paket som du vill använda, till exempel Azure Storage:

    dotnet add package Azure.Storage.Blobs
    
  3. Konfigurera dina tjänster för att lägga till stöd för Azure tokenautentiseringsuppgifter:

    using Microsoft.Identity.Web;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add authentication
    builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddInMemoryTokenCaches();
    
    // Add Azure token credential support
    builder.Services.AddMicrosoftIdentityAzureTokenCredential();
    
    builder.Services.AddControllersWithViews();
    var app = builder.Build();
    app.UseAuthentication();
    app.UseAuthorization();
    app.MapControllers();
    app.Run();
    
  4. Konfigurera alternativ för Azure tokenautentiseringsuppgifter i appsettings.json

    Varning

    Klienthemligheter ska inte användas som klientautentiseringsuppgifter i produktionsmiljöer för agentidentitetsritningar på grund av säkerhetsrisker. Använd i stället säkrare autentiseringsmetoder som federerade autentiseringsuppgifter (FIC) med hanterade identiteter eller klientcertifikat. Dessa metoder ger förbättrad säkerhet genom att eliminera behovet av att lagra känsliga hemligheter direkt i programkonfigurationen.

    {
      "AzureAd": {
        "Instance": "https://login.microsoftonline.com/",
        "TenantId": "<your-tenant>",
        "ClientId": "<agent-blueprint-id>",
    
       // Other client creedentials available. See <https://aka.ms/ms-id-web/client-credentials>
        "ClientCredentials": [
          {
            "SourceType": "ClientSecret",
            "ClientSecret": "your-client-secret"
          }
        ]   
      }
    }
    
  5. Hämta en tokenautentiseringsuppgift från tjänstleverantören och använd den med Azure SDKs klienter.

    1. För agentidentiteter kan du hämta antingen enbart apptoken (autonoma agenter) eller en token för användares räkning (interaktiva agenter) med hjälp av metoden WithAgentIdentity. För endast apptoken anger du RequestAppToken egenskapen till true. För delegerade token som används på användarens vägnar bör du inte ange egenskapen eller uttryckligen ange den till RequestAppToken.

      using Microsoft.Identity.Web;
      
      public class AgentService
      {
          private readonly MicrosoftIdentityTokenCredential _credential;
      
          public AgentService(MicrosoftIdentityTokenCredential credential)
          {
              _credential = credential;
          }
      
          // Call Azure service with the agent identity for app only scenario
          public async Task<List<string>> ListBlobsForAgentAsync(string agentIdentity)
          {
              // Configure for agent identity
              string agentIdentity = "agent-identity-guid";
              _credential.Options.WithAgentIdentity(agentIdentity);
              _credential.Options.RequestAppToken = true;
      
              var blobClient = new BlobServiceClient(
                  new Uri("https://myaccount.blob.core.windows.net"),
                  _credential);
      
              var container = blobClient.GetBlobContainerClient("agent-data");
              var blobs = new List<string>();
      
              await foreach (var blob in container.GetBlobsAsync())
              {
                  blobs.Add(blob.Name);
              }
      
              return blobs;
          }
      
          // Call Azure service with the agent identity for on-behalf of user scenario
          public async Task<List<string>> ListBlobsForAgentAsync(string agentIdentity)
          {
              // Configure for agent identity
              var blobClient = new BlobServiceClient(
                  new Uri("https://myaccount.blob.core.windows.net"));
      
              var container = blobClient.GetBlobContainerClient("agent-data");
              var blobs = new List<string>();
      
              await foreach (var blob in container.GetBlobsAsync())
              {
                  blobs.Add(blob.Name);
              }
      
              return blobs;
          }
      }
      
    2. Du kan också hämta en token för en agents användarkonto. För att göra detta kan du använda antingen UPN (User Principal Name) eller Object Identity (OID) för att identifiera agentens användarkonto.

      För objekt-ID:

      using Microsoft.Identity.Web;
      
      public class AgentService
      {
          private readonly MicrosoftIdentityTokenCredential _credential;
      
          public AgentService(MicrosoftIdentityTokenCredential credential)
          {
              _credential = credential;
          }
      
          // Use object ID to identify the agent's user account
          public async Task<List<string>> ListBlobsForAgentAsync(string agentIdentity)
          {
              // Configure for agent identity
              string agentIdentity = "agent-identity-guid";
              string userOid = "user-object-id";
              _credential.Options.WithAgentUserIdentity(agentIdentity, userOid);
      
              var blobClient = new BlobServiceClient(
                  new Uri("https://myaccount.blob.core.windows.net"),
                  _credential);
      
              var container = blobClient.GetBlobContainerClient("agent-data");
              var blobs = new List<string>();
      
              await foreach (var blob in container.GetBlobsAsync())
              {
                  blobs.Add(blob.Name);
              }
      
              return blobs;
          }
      
          // Use UPN to identify the agent's user account\
          public async Task<List<string>> ListBlobsForAgentAsync(string agentIdentity)
          {
              // Configure for agent identity
              string agentIdentity = "agent-identity-guid";
              string userUpn = "user@contoso.com";
      
              _credential.Options.WithAgentUserIdentity(agentIdentity, userUpn);
      
              var blobClient = new BlobServiceClient(
                  new Uri("https://myaccount.blob.core.windows.net"),
                  _credential);
      
              var container = blobClient.GetBlobContainerClient("agent-data");
              var blobs = new List<string>();
      
              await foreach (var blob in container.GetBlobsAsync())
              {
                  blobs.Add(blob.Name);
              }
      
              return blobs;
          }
      }