Хранение строк подключения к базе данных SQL в хранилище ключей Azure

Я перемещаю секреты приложений из контролируемого исходным кодом web.config (с преобразованиями) в секреты хранилища ключей Azure. Это хорошо работает для таких вещей, как пароли, но кажется, что строки соединения с базой данных SQL трудно переместить из web.config. Существуют различные ссылки на строки подключения в другом месте в файле web.config (например, поставщики ролей, поставщики членства, поставщики профилей, структура сущностей и т. Д.).

Существуют ли какие-либо шаблоны и лучшие практики, которые могут помочь с этой миграцией? Я планировал использовать имя строки подключения в качестве секретного имени и значение строки подключения в качестве секретного значения. Однако я не уверен, что делать с именем поставщика строки подключения.

Кроме того, в идеале, в web.config должен быть только URL-адрес хранилища ключей, но как тогда существующие конфигурации в web.config интегрируются с Key Vault, если в данный момент они ссылаются на фактическую строку соединения.

Приложение ASP.NET, размещенное на IIS, в настоящее время выполняется на виртуальной машине Azure, но необходимо также учитывать локальную разработку.

ОБНОВЛЕНИЕ Как насчет конфигурации, подобной следующей, добавленной и используемой другими библиотеками / пакетами?

<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider"
         type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
         connectionStringName="DefaultConnection" />
  </providers>
</sessionState>
<profile defaultProvider="DefaultProfileProvider">
  <providers>
    <add name="DefaultProfileProvider"
         type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
         connectionStringName="DefaultConnection" applicationName="/" />
  </providers>
</profile>
<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider"
         type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
         connectionStringName="DefaultConnection" enablePasswordRetrieval="false"
         enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6"
         minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
  </providers>
</membership>
<roleManager defaultProvider="DefaultRoleProvider">
  <providers>
    <add name="DefaultRoleProvider"
         type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
         connectionStringName="DefaultConnection" applicationName="/" />
  </providers>
</roleManager>

1 ответ

Решение

Придумали решение: сохраните строки подключения в web.config, так как на них ссылаются другие разделы web.config, но обновите значения при запуске приложения.

protected void Application_Start()
{
    /* ... */

    var configurationReadOnlyField = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

    var connection = ConfigurationManager.ConnectionStrings[connectionName];
    s_configurationReadOnlyField.SetValue(connection, false);

    connection.ConnectionString = newValue;

    /* ... */
}
Другие вопросы по тегам