Хранение строк подключения к базе данных 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;
/* ... */
}