Строки подключения. Этот ответ объясняет, как читать строки подключения из app.config, где они не будут зашифрованы.

сматривал несколько примеров шифрования connectionStrings (Web.config) в приложении ASP.NET MVC (.NET 4.0), и кажется, что есть два основных способа добиться этого (пример 1 и связанныепример 2):

Используйте инструмент aspnet_regiis.

Основная проблема с использованием aspnet_regiis заключается в том, что я могу запустить инструмент локально (на моем компьютере разработчика), но веб-сайт на самом деле размещен на Arvixe и, как и на любом другом веб-хосте: нет способа выполнять команды на сервере. Насколько я понимаю, если я зашифрую строки соединения Web.config на своем компьютере и опубликую файл Web.config, их невозможно будет расшифровать на сервере (исправьте, если это не так).

Примечание: я использовал толькоRSAProtectedConfigurationProvider, но я предполагаю, чтоDataProtectionConfigurationProvider будет иметь ту же проблему, так как это зависит от пользователя / машины.

Программно зашифруйте строку подключения.

Программное шифрование connectionStrings также имеет недостаток: каждый раз, когда я публикую свой веб-сайт, обновляется Web.config (с незашифрованными connectionStrings), и это означает, что в течение некоторого периода времени Web.config не будет зашифрован. Даже если я гарантирую, что файл Web.config публикуется только при наличии изменений в нем, проблема может быть сведена к минимуму, но не уменьшена.

Я подумал, что использование статического класса может помочь сократить время, в котором строки соединений не шифруются. К сожалению, для шифрования connectionStrings требуется путь к приложению, и кажется, что единственный способ получить путь к приложению - это запрос (Request.ApplicationPath) и в статическом классе (очевидно) нет запроса.

private void ProtectSection(string sectionName,
                                   string provider)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
                 config.GetSection(sectionName);

    if (section != null &&
              !section.SectionInformation.IsProtected)
    {
        section.SectionInformation.ProtectSection(provider);
        config.Save();
    }
}

private void UnProtectSection(string sectionName)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
              config.GetSection(sectionName);

    if (section != null &&
          section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
        config.Save();
    }
}

UnProtectSection("appSettings");

ProtectSection("appSettings",
    "DataProtectionConfigurationProvider");

Как правильно зашифровать connectionString и устранить / уменьшить количество времени, в течение которого раздел Web.config не шифруется? Вы пишете какую-то обертку вокругOpenWebConfiguration метод, который проверяет, если раздел зашифрован и использовать только эту оболочку? Пользователи могут получить доступЛюбые страница на вашем веб-сайте, так как же вы задерживаете шифрование, пока они не запросят некоторые данные из базы данных, или вы проверяете, зашифровано ли оно при первой возможности?