我们有一些需要共享外部应用程序配置文件的应用程序和服务。外部文件包含一个configSection,其中包含我们要加密的信息。 每个服务和应用程序驻留在它自己的应用程序文件夹中,这就是问题开始升级的地方。 在App.config中,可以使用'configSource'或'file'属性来引用外部文件。 'configSource'无法使用,因为外部配置文件不在应用程序文件夹或应用程序子文件夹中。因此我们必须使用'文件'属性。外部应用程序配置和设置加密
<customSettings file=”path to setting”/>
为随后的 'customSettings' configSection被定义为:
<configSections>
<section name="customSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
我则尝试使用这样的代码来加密configSection:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection section = config.GetSection("customSettings");
if (!section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
config.Save();
}
因为我使用文件属性(我怀疑)。配置部分在App.config中加密,而外部文件不是。在App.config中加密的只是
<customSettings file=”path to setting”/>
。这是很没用的。
这意味着个人应用程序和服务无法加密外部配置文件。 然后,我有了一个想法,即将一个小应用程序放置在与外部配置文件相同的目录中。此应用程序的目的是通过使用'configSource'属性来加密外部配置文件。这种方法根本不起作用。什么也没有发生,没有任何加密。
为了进一步研究,我将'customSettings'放在App.config中并成功加密了该部分。然后,我将加密的数据复制到外部文件,以测试加密是否可以在外部配置文件中工作。这对'configSource'很好,但在使用'file'属性时引发异常。
抛出异常:
Unrecognized attribute 'configProtectionProvider'
因为我们必须使用的app.config的“文件”属性我现在有2个问题。
- 无法加密外部文件。
- 如果手动加密外部文件,我无法使用'文件'属性读取它。
我已经解决了我的第一个问题。 原来,我需要调用: 'section.SectionInformation.ForceSave = true;' 在实际保存配置之前。当使用configSource属性时,外部配置文件现在被加密 –