Могу ли я добавить ConnectionStrings в ConnectionStringCollection во время выполнения?

Есть ли способ, где я могу добавить строку подключения в ConnectionStringCollection, возвращаемую ConfigurationManager во время выполнения в приложении Asp.Net?

Я пробовал следующее, но мне сказали, что файл конфигурации только для чтения.

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

Есть ли другой способ сделать это во время выполнения? Я знаю, что во время разработки я могу добавить строку подключения в web.config; Тем не менее, я хочу добавить что-то в эту коллекцию во время выполнения.

Спасибо

РЕДАКТИРОВАТЬ: Одна из причин, почему я пытаюсь сделать это из-за требования безопасности, которое не позволяет мне разместить ConnectionStrings в web.config (даже в зашифрованном виде). Я хотел бы использовать такие элементы, как членство и профили в моем проекте; Тем не менее, я ищу альтернативу делать без написания пользовательских провайдера. Таможенные провайдеры не так уж и плохи, но если я могу найти более простое решение, я полностью за это.

10.12.2008 20:19:47
Вы можете переместить строки подключения из web.config. См. Рекомендации
RickAndMSFT 17.03.2015 03:36:23
8 ОТВЕТОВ
РЕШЕНИЕ
var cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(@"/");
cfg.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(params));

cfg.Save();

Имейте в виду, что это приведет к перезагрузке вашего сайта, поскольку он изменяет конфигурационный файл. Проверьте http://msdn.microsoft.com/en-us/library/4c2kcht0(VS.80).aspx

11
27.03.2013 13:51:59
Мотивировкой для этого вопроса было удаление строки подключения из web.config - что является наилучшей практикой безопасности, потому что вы не хотите передавать секреты всем, у кого есть доступ к исходному коду. См. Рекомендации
RickAndMSFT 20.03.2015 06:12:54

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

0
10.12.2008 20:31:31
-1 это совсем не так, это просто заставляет ваш сайт перерабатываться.
Chris Marisic 17.03.2015 14:28:40
Ооо ... давай !! Конечно, вы можете это XML-файл, но это очень плохая практика. .NET не имеет API для изменения файлов конфигурации .... спросите себя, почему. "-)
ema 18.03.2015 09:38:40
опять неверно, у него абсолютно есть API для изменения файлов конфигурации OpenWebConfiguration/Save stackoverflow.com/a/719941/37055
Chris Marisic 18.03.2015 20:21:05
Не знал этого. Ответ довольно старый, и в любом случае я думаю (ИМХО), что это не очень хорошая практика для подражания.
ema 19.03.2015 10:59:32
даже принятый ответ здесь OpenWebConfiguration, по иронии судьбы, я не прокручивал, прежде чем связываться с другим вопросом. Я, конечно, согласен с вами, что все не должны этого делать, но не могут быть абсолютными. Абсолюты почти всегда неправы в любой ситуации в программном обеспечении ... если только это не связано с Oracle, но я отвлекся
Chris Marisic 19.03.2015 18:15:12

Если вы пытаетесь редактировать строки подключения в вашем файле web.config во время выполнения, взгляните на WebConfigurationManager .

Если вы просто пытаетесь изменить конфигурацию во время выполнения, чтобы вставить строку подключения, то вам не повезло. Предполагается, что дерево объектов ConfigurationManager является прямым отражением файлов конфигурации, если бы вы могли изменить это состояние, тогда оно будет несовместимым.

Я бы порекомендовал создать простой класс фасадов, который вы могли бы использовать для получения строк подключения. Таким образом, вы можете сделать так, чтобы фасад возвращал строку подключения из вашей коллекции «на лету», или, если она не существует, он может получить ее из ConfigurationManager.

class ConnectionStringProvider
{
    Dictionary<string, System.Configuration.ConnectionStringSettings> _localStrings = new Dictionary<string, System.Configuration.ConnectionStringSettings>();

    public void AddLocalConnectionString(string name, string connstring)
    {
        System.Configuration.ConnectionStringSettings cs = new System.Configuration.ConnectionStringSettings(name, connstring);
        _localStrings.Add(name, cs);
    }

    public void RemoveLocalConnectionString(string name)
    {
        _localStrings.Remove(name);
    }

    public System.Configuration.ConnectionStringSettings this[string name] {
        get 
        { 
            return _localStrings.ContainsKey(name) ? _localStrings[name] : System.Configuration.ConfigurationManager.ConnectionStrings[name]; 
        }
    }
}

Или вы всегда можете пойти немного тяжелее и использовать что-то вроде блока конфигурации корпоративной библиотеки.

4
10.12.2008 20:47:32

Еще не пробовали, но, возможно, вы можете изменить значение существующей строки соединения во время выполнения? Например, вместо:

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));

Может быть, вы могли бы сделать что-то вроде:

ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString = "something";

Если это так, вы можете указать строку подключения «переменные» в конфигурации, но установить для них значение false или пустые строки подключения:

<add name="myconnection" connectionString="SET AT RUNTIME" ... />
1
10.12.2008 20:56:39
Модификация требует отражения: david.gardiner.net.au/2008/09/programmatics-setting.html
user423430 13.12.2011 18:23:19

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

Это звучит как проблема требований и должно быть решено там.

10
10.12.2008 21:01:28
Я попробовал на этом. Это конкретное требование исходит от команды, отвечающей за безопасность DMZ, и не хочет рисковать разоблачением в случае сбоя машины ... даже в зашифрованном состоянии, поскольку в худшем случае у них будет ключ машины в этой точке. сценарий также.
JamesEggers 10.12.2008 21:08:46
Хм, если они взломали этот ящик, они скоро найдут ваш SQL-сервер ... вам нужно иметь строку подключения на сервере в той или иной форме ... это глупое требование
JoshBerke 10.12.2008 21:20:17
Я полностью согласен с Джошем, как только они будут рутировать ваш веб-сервер, ваша база данных будет вскоре подписана. Это защищено соответствующими системами обнаружения вторжений, в которых вы можете отключить свои серверы, что на данный момент является единственным надежным решением для взломанной базы данных.
Chris Marisic 10.12.2008 21:42:17
Я чувствую вашу боль, но учетные данные пользователя ASP.NET должны иметь право на любой метод, который ваш код использует для получения строки подключения. Таким образом, даже если ваш пользовательский код получает строку подключения с удаленного сервера или через какой-либо веб-сервис, хакер сможет использовать тот же метод.
joshperry 11.12.2008 14:35:14
web.config считается исходный код и секреты никогда не должны быть проверены на источник увидеть лучшие практики для развертывания паролей и других конфиденциальных данных в ASP.NET и Azure сайты asp.net/identity/overview/features-api/...
RickAndMSFT 17.03.2015 03:35:33

Инфраструктура конфигурации поддерживает очень надежное шифрование с помощью Windows DataProtection API, который использует машинный ключ для шифрования разделов конфигурации. Таким образом, было бы невозможно прочитать зашифрованные данные нигде, кроме как на машине, где они были зашифрованы.

Это тот же API, который используется для правительственного шифрования диска / папки в Windows. Будет ли это соответствовать требованиям безопасности вашей компании?

Либо вручную, либо с помощью автоматизации развертывания вы можете выполнить эту команду для шифрования раздела connectionStrings вашего web.config для определенного веб-приложения.

aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider"
1
11.12.2008 01:54:28

Если вы используете MS SQL, вы можете настроить свой веб-сервер для доступа к SQL-серверу через проверку подлинности Windows, поэтому вам никогда не придется вообще вводить какие-либо пароли в веб-конфигурации или даже перемещаться в памяти приложения.

1
11.12.2008 02:00:53

Вы можете использовать отражение, чтобы отключить приватное поле bReadOnly (плохая идея и т. Д.):

typeof(ConfigurationElementCollection)
    .GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(ConfigurationManager.ConnectionStrings, false);
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings());

Это похоже на технику, необходимую для изменения существующей строки соединения , и добавлено в качестве комментария Брайаном Роджерсом.

30
13.12.2011 18:29:41
Крутой хак! Вы правы, это плохая идея - но она работает для добавления констант. Мотивация вопроса заключается в том, как удалить conStrs из web.config - что является наилучшей практикой безопасности, чтобы секреты не вытекли из исходного кода. См. Asp.net/identity/overview/features-api/…, чтобы узнать, как их перемещать (Лучшие практики для развертывания паролей и других конфиденциальных данных на сайтах ASP.NET и Azure)
RickAndMSFT 20.03.2015 06:11:01