es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Bot de Teams: obtener credenciales desde Key Vault

He buscado un poco pero no encontré algo que me esté ayudando. He creado un bot para Teams y como se describe en todos los ejemplos, estoy usando el archivo appsettings.json para almacenar la ID y la contraseña del bot (MicrosoftAppId y MicrosoftAppPassword). Estas dos son manejadas de alguna manera por el framework. Pero ahora quiero usar un Azure Key Vault para almacenar el secreto en lugar de tener el archivo appsettings.

Así que encontré algunos ejemplos que explican cómo hacer esto en BotFramework V3 con el atributo BotAuthentication e incluso algo para BotFramework V4 aquí (enlace de trabajo para el ejemplo vinculado aquí). Pero incluso ese ejemplo es antiguo y ya no existe de esa manera.

¿Cómo se supone que debo hacer esto para un bot de Teams y c# dotnet 3.1?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para utilizar un Azure Key Vault y almacenar el secreto de un bot de Teams en C# .NET 3.1, puedes seguir los siguientes pasos:

    1. Crea un Azure Key Vault y añade un secreto que contenga la contraseña de la aplicación de Microsoft para tu bot.
    2. En tu proyecto de C# .NET 3.1, instala los siguientes paquetes NuGet:

    • Microsoft.Extensions.Configuration.AzureKeyVault
    • Microsoft.Identity.Client
    1. En tu archivo appsettings.json, elimina las entradas MicrosoftAppId y MicrosoftAppPassword y añade las siguientes entradas:

      "AzureAd": {
       "Instance": "https://login.microsoftonline.com/",
       "Domain": "<nombre de="" tu="" inquilino="" de="" azure="" ad="">",
       "ClientId": "<id de="" aplicación="" de="" tu="" bot="">",
       "ClientSecret": "<contraseña de="" aplicación="" de="" tu="" bot="">",
       "TenantId": "<id de="" inquilino="" de="" azure="" ad="">"
      },
      "AzureKeyVault": {
       "Vault": "<url de="" tu="" azure="" key="" vault="">"
      }
      

    2. En tu archivo Program.cs, añade el siguiente código para cargar la configuración desde Azure Key Vault:
      using Microsoft.Azure.Services.AppAuthentication;
      using Microsoft.Extensions.Configuration;
      using Microsoft.Extensions.Configuration.AzureKeyVault;
      
      //...
      
      var config = new ConfigurationBuilder()
       .AddJsonFile("appsettings.json", optional: false)
       .AddEnvironmentVariables()
       .Build();
      
      var keyVaultEndpoint = config["AzureKeyVault:Vault"];
      if (!string.IsNullOrEmpty(keyVaultEndpoint))
      {
       var azureServiceTokenProvider = new AzureServiceTokenProvider();
       var keyVaultClient = new KeyVaultClient(
         new KeyVaultClient.AuthenticationCallback(
           azureServiceTokenProvider.KeyVaultTokenCallback));
       config = new ConfigurationBuilder()
         .AddConfiguration(config)
         .AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager())
         .Build();
      }
      
      //...
      
      
    3. En tu archivo Startup.cs, actualiza el método ConfigureServices para añadir el siguiente código:
      using Microsoft.AspNetCore.Authentication;
      using Microsoft.AspNetCore.Authentication.AzureAD.UI;
      using Microsoft.AspNetCore.Authentication.JwtBearer;
      using Microsoft.Bot.Builder;
      using Microsoft.Bot.Builder.Azure;
      using Microsoft.Bot.Connector.Authentication;
      using Microsoft.Extensions.Configuration;
      using Microsoft.Extensions.DependencyInjection;
      using Microsoft.IdentityModel.Tokens;
      using System;
      using System.Linq;
      
      //...
      
      public void ConfigureServices(IServiceCollection services)
      {
       //...
      
       IConfiguration configuration = services.BuildServiceProvider().GetRequiredService<iconfiguration>();
      
       services.AddSingleton(sp =>
       {
         var credential = new SimpleCredentialProvider(
           configuration.GetValue<string>("MicrosoftAppId"),
           configuration.GetValue<string>("MicrosoftAppPassword"));
         var channelProvider = new ConfigurationChannelProvider(configuration);
         return new MicrosoftAppCredentials(credential.AppId, credential.Password)
         {
           MicrosoftAppId = credential.AppId,
           MicrosoftAppPassword = credential.Password
         };
       });
      
       services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme)
         .AddAzureADBearer(options => configuration.Bind("AzureAd", options));
      
       services.Configure<jwtbeareroptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
       {
         var audienceConfig = configuration.GetSection("AzureAd").Get<audienceconfig>();
         options.TokenValidationParameters = new TokenValidationParameters
         {
           ValidateIssuer = true,
           ValidIssuers = new[] { $"https://sts.windows.net/{audienceConfig.TenantId}/" },
           ValidateAudience = true,
           ValidAudiences = audienceConfig.Audiences.Split(',').Select(a => a.Trim()).ToArray(),
           ValidateLifetime = true
         };
       });
      
       var storageAccount = CloudStorageAccount.Parse(configuration.GetConnectionString("AzureWebJobsStorage"));
       var conversationStateContainer = new AzureBlobStorage(
         new AzureBlobStorageOptions
         {
           ConnectionString = storageAccount.ConnectionString,
           ContainerName = configuration.GetValue<string>("BlobStorage:ContainerName")
         });
      
       services.AddSingleton<istorage>(conversationStateContainer);
      
       var userStateContainer = new AzureBlobStorage(
         new AzureBlobStorageOptions
         {
           ConnectionString = storageAccount.ConnectionString,
           ContainerName = configuration.GetValue<string>("BlobStorage:ContainerName") + "-user"
         });
      
       services.AddSingleton<istorage>(userStateContainer);
      
       //...
      }
      
    4. Utiliza el objeto MicrosoftAppCredentials para autenticar tu bot al llamar a las APIs del Bot Framework.

    Siguiendo estos pasos, deberías poder almacenar la contraseña de la aplicación de Microsoft para tu bot en un Azure Key Vault y recuperarla en tiempo de ejecución en tu proyecto de C# .NET 3.1.</contraseña>

Comments are closed.