覆盖加密的配置部分而不解密
本文关键字:解密 配置部 加密 覆盖 | 更新日期: 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。
我怀疑在你的情况下这很好。现在,如果需要,可以添加自己的连接字符串,并且实际上不需要完全吹掉连接字符串部分。