2015-03-24 9 views
1

Обратите внимание, что Я в курсе этого вопроса:
Encrypting AppSettings in file external to Web.ConfigШифрование частичных внешних AppSettings CONFIG

И это НЕ боян. У этого вопроса есть ответ, позволяющий шифровать внешний файл конфигурации appSettings , только если appSettings связан с использованием атрибута configSource. Я хочу использовать атрибут file. Итак, у меня есть что-то подобное в моей Web.config:

<appSettings file="ExternalSettings.config"> 
    <add key="InternalSetting" value="Test123" /> 
</appSettings> 

... и файл ExternalSettings.config в том же каталоге, со своим собственным appSettings разделе. Когда я запускаю свое веб-приложение, два файла appSettings объединяются вместе. Однако, если я пытаюсь просто зашифровать свой файл ExternalSettings.config так:

var webConfig = WebConfigurationManager.OpenWebConfiguration("~/ExternalSettings.config"); 
ConfigurationSection section = webConfig.GetSection("appSettings"); 
if (!section.SectionInformation.IsProtected) { 
    section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider"); 
    webConfig.Save(); 
} 

Я получаю ConfigurationErrorsException говоря

«Файл конфигурации не может быть создан для запрашиваемого объекта конфигурации.»

(кстати, этот код работает отлично для шифрования в appSettings раздел, который как раз в Web.config)

Есть ли способ шифрования параметров в моем файле ExternalSettings.config, но оставляя Web.Config - незашифрованные?

ответ

0

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

<appSettings file="Configuration\AppSettings.config" /> 

Что-то во внешнем файле

<appSettings> 
    <!--Your configuration keys--> 
</appSettings> 

Внешний раздел правильно шифровать/дешифровать

0

Да, это возможно. Вы можете использовать следующий код для шифрования appSettings файла конфигурации.

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
fileMap.ExeConfigFilename = "ExternalSettings.config"; 
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
AppSettingsSection section = configuration.AppSettings; 
if (section != null && section.SectionInformation.IsProtected == false) 
{ 
    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); 
    configuration.Save(); 
} 

Однако это ожидает действительный файл конфигурации, а не фрагмент appSettings. Таким образом, вы должны приложить AppSettings в виде в Кoнфигурировании элемента перед запуском

<configuration> 
    <appSettings> 
     <add.... 
    </appSettings> 
</configuration> 

Это превратит файл во что-то вроде

<configuration> 
    <appSettings configProtectionProvider="DataProtectionConfigurationProvider"> 
    <EncryptedData> 
     <CipherData>  <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAADx8S4qABcUakeKay9R2hvgQAAAACAAAAAAADZgAAwAAAABAAAAAyNc22wc25O41jcxXcAD8MAAAAAASAAACgAAAAEAAAAIRVbMW6KjGTFu0O8ZC1YGqIAAAAO6L8wKbLrXX4WSh+HBMPMzR1ypiWMGfC/tFS0swDwYCbBYZEXM1WU9vf3XTA/zftK+6yYLDXQ348Easx0f/a+IaZlsUvtsCJ9LSBSVM/++7JZkKrq2Zah2aQjqjn3G80XqCNc+OCNiFRhmb2ng8m3ioxC/CeOC9mVBX2qz97PIend+u4CLVBIhQAAAAsoiPgaQd9sRcFjsXQuYtTWY+qgw==</CipherValue> 
     </CipherData> 
    </EncryptedData> 
    </appSettings> 
</configuration> 

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

Смежные вопросы