Chiamare i servizi di Azure dall'agente usando .NET Azure SDK

Questo articolo illustra come chiamare i servizi di Azure dal tuo agente. Per eseguire l'autenticazione a servizi Azure, ad esempio Archiviazione di Azure o Azure Key Vault usando le identità dell'agente, usare la classe MicrosoftIdentityTokenCredential da Microsoft. Identity.Web. Azure. La classe MicrosoftIdentityTokenCredential implementa l'interfaccia TokenCredential di Azure SDK, consentendo un'integrazione trasparente tra Microsoft.Identity.Web e i client di Azure SDK.

Per chiamare un'API da un agente, è necessario ottenere un token di accesso che l'agente può usare per autenticarsi all'API. È consigliabile usare il Microsoft. Identity.Web SDK per .NET per chiamare le API Web. Questo SDK semplifica il processo di acquisizione e convalida dei token. Per altre lingue, usare l'SDK dell'agente Microsoft Entra per l'ID agente.

Prerequisiti

  • Identità dell'agente con autorizzazioni appropriate per chiamare l'API di destinazione. È necessario un utente per il flusso on-behalf-of.
  • Account utente di un agente con autorizzazioni appropriate per chiamare l'API di destinazione.

Passaggi di implementazione

  1. Devi installare il pacchetto di integrazione Azure e il pacchetto Microsoft.Identity.Web.AgentIdentities per aggiungere il supporto per le identità dell'agente.

    dotnet add package Microsoft.Identity.Web.Azure
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Installare il pacchetto Azure SDK da usare, ad esempio, Archiviazione di Azure:

    dotnet add package Azure.Storage.Blobs
    
  3. Configurare i servizi per aggiungere il supporto delle credenziali token di Azure.

    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. Configurare le opzioni delle credenziali del token di Azure in appsettings.json

    Avvertimento

    I segreti client non devono essere usati come credenziali client negli ambienti di produzione per i progetti di identità agente a causa di rischi per la sicurezza. Usare invece metodi di autenticazione più sicuri, ad esempio le credenziali di identità federate (FIC) con identità gestite o certificati client. Questi metodi offrono una sicurezza avanzata eliminando la necessità di archiviare segreti sensibili direttamente all'interno della configurazione dell'applicazione.

    {
      "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. Acquisire una credenziale del token dal provider di servizi e usarla con Azure SDK client.

    1. Per le identità degli agenti, è possibile acquisire un token solo per l'app (agenti autonomi) o un token per conto dell'utente (agenti interattivi) usando il metodo WithAgentIdentity. Per i token per sole app, impostare la proprietà RequestAppToken su true. Per i token "delegati per conto dell'utente," non impostare la proprietà RequestAppToken o impostarla esplicitamente su false.

      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. È anche possibile acquisire un token per l'account utente di un agente. A tale scopo, è possibile usare il nome dell'entità utente (UPN) o l'OID (Object Identity) per identificare l'account utente dell'agente.

      Per ID oggetto:

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