覆盖加密的配置部分而不解密

本文关键字:解密 配置部 加密 覆盖 | 更新日期: 2023-09-27 18:36:01

当我尝试访问已加密且无法正确解密的配置部分时(例如,有人刚刚盲目地从另一台机器上获取配置文件) - Configuration类抛出异常。我想抓住这种情况并在这种情况下完全重写该部分。

我试图删除并添加回有问题的部分,但似乎删除被忽略了 - "catch"中的第二条语句抛出了关于该部分的另一个异常已经存在:

try
{
    // this getter might throw an exception - e.g. if encrypted on another machine
    var connStrings = config.ConnectionStrings;
}
catch (ConfigurationException)
{
    config.Sections.Remove("connectionStrings");
    config.Sections.Add("connectionStrings", new ConnectionStringsSection());
}

这可能与我将 connectionString 部分驻留在单独的文件中的事实有关,即我的配置文件具有类似 <connectionStrings configSource="connections.config"/> 的内容,而实际的加密内容在connections.config文件中。

是否可以仅使用 .NET 配置类来执行我需要的操作,而无需回退到直接 XML 操作?

覆盖加密的配置部分而不解密

我很

确定这会做你想要的。就我而言,我只是包含一个虚假的连接字符串设置:

<connectionStrings>
    <add connectionString="foo"/>
</connectionStrings>

我没有包含"name"属性,所以尝试读取 ConnectionString 会爆炸,就像您的情况一样:

try {
    var x = ConfigurationManager.ConnectionStrings;   //blows up             
}
catch {
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.Sections.Remove("connectionStrings");
    config.Save(); //Now save the changes
    ConfigurationManager.RefreshSection("connectionStrings"); //and reload the section
    var x = ConfigurationManager.ConnectionStrings; //can now read!                
}

您仍然无法执行此操作:

config.Sections.Add("connectionStrings", new ConnectionStringsSection());

因为(至少在我的机器上),它从 Machine.config 中获取 connectionStrings。

我怀疑在你的情况下这很好。现在,如果需要,可以添加自己的连接字符串,并且实际上不需要完全吹掉连接字符串部分。