Конструктор конфигурации хранилища ключей Azure в 4.7.1 - PullRequest
0 голосов
/ 12 декабря 2018

Мы не можем перейти на .net core в моей компании.Я пытаюсь выяснить, как наилучшим образом использовать хранилище ключей Azure для хранения элементов конфигурации для наших служб приложений API.

У меня есть простой проект webapi с этим файлом global.asax:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Http.WebHost;
using System.Web.Routing;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureKeyVault;

namespace kv.api
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

            LoadAzureKeyVaultSettings();
        }


        protected void LoadAzureKeyVaultSettings()
        {
            var tokenProvider = new AzureServiceTokenProvider("RunAs=CurrentUser;");

            var kvClient = new KeyVaultClient((authority, resource, scope) => tokenProvider.KeyVaultTokenCallback(authority, resource, scope));

            var builder = new ConfigurationBuilder()
                .AddAzureKeyVault("https://mykvurihere.vault.azure.net/", kvClient, new DefaultKeyVaultSecretManager());

            builder.Build();
        }
    }

}

Тогда у меня есть простая конечная точка webapi:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using kv.api.Models;

namespace kv.api.Controllers
{
    public class SettingsController : ApiController
    {
        /// <summary>
        /// Method that returns all the keys out of the Configuration Manager's App Settings.  Can use this endpoint to test KeyVault integrations.
        /// </summary>
        /// <returns>List of Settings</returns>
        public IEnumerable<Setting> GetAllSettings()
        {
            var settings = ConfigurationManager.AppSettings.AllKeys
                .Select(key => new Setting()
                {
                    Key = key,
                    Value = ConfigurationManager.AppSettings[key]
                })
                .ToList();

            return settings;
        }
    }
}

Он компилируется, яне получите никаких исключений времени выполнения, но эта конечная точка не дает мои конфиги из хранилища ключей (я получаю appSettings, определенные в моем web.config).Что мне здесь не хватает?

--- ОБНОВЛЕНИЕ Похоже, что ключевые метрики хранилища, представленные на портале Azure, показывают, что мое приложение успешно извлекает секреты, но они не добавляются в AppSettings приложения...

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Я приложил немало усилий, чтобы выяснить это, поэтому решил написать довольно длинный пост об этом в блоге, который вы можете найти здесь .

В двух словах, на мой взглядлучший способ интегрировать конструктор конфигурации Key Vault - не с помощью кода .NET, а просто путем добавления Key Vault в качестве подключенной службы , а затем настройте его в файле Web.config, например:

<configuration>
  <configSections>
    <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
  </configSections>
  <configBuilders>
    <builders>
      <add name="AzureKeyVault" vaultName="your vault's name" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=1.0.0.0, Culture=neutral" />
    </builders>
  </configBuilders>
  <appSettings configBuilders="AzureKeyVault">
    <add key="MyValue" value="Value from Web.config" />
  </appSettings>
  ...
</configuration>

Затем, если вы правильно настроите аутентификацию между хранилищем ключей и вашим приложением, добавьте в хранилище ключей секрет с именем «MyValue», он будет заменен во время выполнения, и вы сможете получить доступ ксекрет от Key Vault в вашем приложении, как это:

ConfigurationManager.AppSettings["MyValue"]
0 голосов
/ 12 декабря 2018

Я нашел решение, но оно кажется очень странным ... Публикация здесь, чтобы получить обратную связь.В итоге я вручную установил ключ / значения в коллекции ConfigurationManager.AppSettings, например:

using System.Configuration;
using System.Web.Http;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureKeyVault;
using ConfigurationBuilder = Microsoft.Extensions.Configuration.ConfigurationBuilder;

namespace kv.api
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

            LoadAzureKeyVaultSettings();
        }


        protected void LoadAzureKeyVaultSettings()
        {
           var tokenProvider = new AzureServiceTokenProvider(ConfigurationManager.AppSettings["AzureServiceTokenProviderConnectionString"]);

           var kvClient =  new KeyVaultClient(
                new KeyVaultClient.AuthenticationCallback(tokenProvider.KeyVaultTokenCallback));

            var builder = new ConfigurationBuilder()
                .AddAzureKeyVault("https://mykvurihere.vault.azure.net/", kvClient,
                    new DefaultKeyVaultSecretManager());

           var config = builder.Build();

           foreach (var keyValuePair in config.AsEnumerable())
           {
               ConfigurationManager.AppSettings.Set(keyValuePair.Key, keyValuePair.Value);
           }  
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...