我正在尝试根据ProtectedConfigurationProvider使用this page保护.Net桌面应用的配置文件。我实现了一个新的提供者类,保护配置部分,我将节点反序列化为模型,加密内部的字符串值,然后将加密模型序列化为节节点并放入新的“EncryptedData”元素,反之亦然。 例如,我在配置文件中有一个“appSettings”部分:
<appSettings>
<add key="test key" value="test value" />
</appSettings>
加密后:
<appSettings configProtectionProvider="customProtectionProvider">
<EncryptedData>
<appSettings>
<add key="6ZefRBry+Q" value="6ZefRB2w7OuU" />
</appSettings>
</EncryptedData>
</appSettings>
这是我遇到的问题:当我尝试解密受保护的配置数据时,当我将加密的部分xml反序列化为模型,然后再次进入反序列化部分时,我的自定义提供程序中的Decrypt方法将始终被触发。
加载配置并获取“appSettings”部分
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection appSettingsSection =
config.GetSection("appSettings"); // fire Decrypt method here
// ......
在提供商的解密方法
中 var sectionModel = ConfigurationBase.Deserialize(encryptedNode);
反序列化
//...get custom section type by encryptedNode.Name
Type sectionType = typeof(Section.AppSettingsSection);
XmlSerializer serializer = new XmlSerializer(sectionType); // fire Decrypt method here and then infinite loops
这是我的AppSettingsSection类:
[XmlRoot("appSettings")]
public class AppSettingsSection : ConfigurationBase
{
[XmlAttribute("file")]
public string File { get; set; }
[XmlElement("add")]
public List<KeyValueNode> Settings { get; set; }
protected override void encryp()
{
// ......
}
protected override void decrypt()
{
// ......
}
}
我不知道为什么用这种类型创建XmlSerializer会调用ProtectedConfigurationProvider的Decrypt方法。
有没有解决方案?
答案 0 :(得分:0)
我下载了System.Xml.Serialization的调试符号并进入它,然后我找到65行TempAssembly类,ProtectedConfigurationProvider.Decrypt
方法将被调用,所以我检查了{{3} }属性,在getter中它调用System.Xml.Serialization.AppSettings
类试图从ConfigurationManager.AppSettings
配置部分获取值,但我之前已经对其进行了封装,因此再次调用Decrypt
方法。
最后,解决方案是避免加密appSettings
cofnig部分。