【发布时间】:2016-10-06 21:11:41
【问题描述】:
我们有许多需要共享外部应用配置文件的应用和服务。外部文件包含一个 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();
}
因为我使用的是文件属性(我怀疑)。 config 部分在 App.config 中加密,而外部文件没有。在 App.config 中加密的只是
<customSettings file=”path to setting”/>
。这没什么用。
这意味着单个应用程序和服务无法加密外部配置文件。 然后我想到我将放置一个与外部配置文件位于同一目录中的小型应用程序。此应用程序的目的是通过使用“configSource”属性来加密外部配置文件。这种方法根本不起作用。什么都没有发生,也没有加密。
为了进一步调查,我在 App.config 中放置了“customSettings”并成功加密了该部分。然后我将加密数据复制到外部文件中,以测试加密是否可以在外部配置文件中工作。这适用于“configSource”,但在使用“file”属性时会引发异常。
抛出异常:
Unrecognized attribute 'configProtectionProvider'
由于我们必须在 app.config 中使用“文件”属性,我现在遇到了 2 个问题。
- 无法加密外部文件。
- 如果外部文件是手动加密的,我无法使用“文件”属性读取它。
【问题讨论】:
-
我已经解决了我遇到的第一个问题。原来我需要调用:
section.SectionInformation.ForceSave = true;在实际保存配置之前。使用 configSource 属性时,外部配置文件现在被加密