ProtectedConfigurationProvider.Decrypt在解密配置节节点时继续触发

时间:2017-03-17 10:48:45

标签: c# config

我正在尝试根据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方法将始终被触发。

  1. 加载配置并获取“appSettings”部分

    Configuration config = 
        ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    ConfigurationSection appSettingsSection = 
        config.GetSection("appSettings"); // fire Decrypt method here
        // ......
  2. 在提供商的解密方法

    var sectionModel = ConfigurationBase.Deserialize(encryptedNode);

  3. 反序列化

    
    //...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
    
  4. 这是我的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方法。

    有没有解决方案?

1 个答案:

答案 0 :(得分:0)

我下载了System.Xml.Serialization的调试符号并进入它,然后我找到65行TempAssembly类,ProtectedConfigurationProvider.Decrypt方法将被调用,所以我检查了{{3} }属性,在getter中它调用System.Xml.Serialization.AppSettings类试图从ConfigurationManager.AppSettings配置部分获取值,但我之前已经对其进行了封装,因此再次调用Decrypt方法。

最后,解决方案是避免加密appSettings cofnig部分。