Llame a los servicios de Azure desde el agente mediante .NET SDK de Azure

En este artículo se explica cómo llamar a los servicios de Azure desde su agente. Para autenticarse en servicios de Azure como Azure Storage o Azure Key Vault mediante identidades de agente, use la clase MicrosoftIdentityTokenCredential de Microsoft.Identity.Web.Azure. La clase MicrosoftIdentityTokenCredential implementa la interfaz TokenCredential de SDK de Azure, lo que permite la integración fluida entre Microsoft.Identity.Web y los clientes de SDK de Azure.

Para llamar a una API desde un agente, debe obtener un token de acceso que el agente puede usar para autenticarse en la API. Se recomienda usar el Microsoft.Identity.Web SDK para llamar a sus API web en .NET. Este SDK simplifica el proceso de adquisición y validación de tokens. Para otros idiomas, use el SDK de Microsoft Entra para el ID del agente.

Prerrequisitos

  • Una identidad del agente con los permisos adecuados para llamar a la API de destino. Necesita un usuario para el flujo de representación.
  • Una cuenta de usuario del agente con los permisos adecuados para llamar a la API de destino.

Pasos de implementación

  1. Instale el paquete de integración de Azure y el Microsoft. Paquete Identity.Web.AgentIdentities para agregar compatibilidad con identidades de agente.

    dotnet add package Microsoft.Identity.Web.Azure
    dotnet add package Microsoft.Identity.Web.AgentIdentities
    
  2. Instale el paquete SDK de Azure que desea usar, por ejemplo, Azure Storage:

    dotnet add package Azure.Storage.Blobs
    
  3. Configure los servicios para agregar la compatibilidad con credenciales de token de 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. Configure las opciones de credenciales de token de Azure en appsettings.json

    Advertencia

    Los secretos de cliente no se deben usar como credenciales de cliente en entornos de producción para planos técnicos de identidad del agente debido a riesgos de seguridad. En su lugar, use métodos de autenticación más seguros, como credenciales de identidad federada (FIC) con identidades administradas o certificados de cliente. Estos métodos proporcionan seguridad mejorada eliminando la necesidad de almacenar secretos confidenciales directamente dentro de la configuración de la aplicación.

    {
      "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. Adquiera una credencial de token del proveedor de servicios y úsela con SDK de Azure clientes.

    1. En el caso de las identidades de agente, puede adquirir un token únicamente de aplicación (agentes autónomos) o un token en nombre del usuario (agentes interactivos) usando el método WithAgentIdentity. En el caso de los tokens de solo aplicación, establezca la propiedad RequestAppToken en true. Para los tokens delegados en nombre de usuario, no establezca la propiedad RequestAppToken o establézcala explícitamente en 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. También puede adquirir un token para la cuenta de usuario de un agente. Para ello, puede usar el nombre principal de usuario (UPN) o la identidad de objeto (OID) para identificar la cuenta de usuario del agente.

      Para el identificador de objeto:

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