App.config - 加密部分错误:

5

我有一个应用程序,它对配置文件中的一个部分进行加密。第一次尝试从配置文件中读取加密部分时,会收到错误消息:“未识别属性'configProtectionProvider'。请注意,属性名称区分大小写。”

config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
// Get the section in the file.   
ConfigurationSection section = config.GetSection("EncryptedSection");


if (section != null)      
{           
    // Protect the section.
    section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
    section.SectionInformation.ForceSave = true;

    // Save the change.

    config.Save(ConfigurationSaveMode.Modified);  
}  
ConfigurationManager.RefreshSection("EncryptedSection");  
Properties.Settings.Default.Reset();

//This is the part where I read the encrypted section:

ConfigurationManager.RefreshSection("EncryptedSection");
System.Collections.IDictionary HSMMasterKeyConfig = (System.Collections.IDictionary)System.Configuration.ConfigurationManager.GetSection("EncryptedSection");

这只发生在我尝试读取加密部分的第一次。我注意到在第一次保存后,.config文件立即更新,但出于某种原因,我需要重新启动应用程序才能使用加密部分。


嗯,在运行时修改配置文件并不是典型的用法。你或许应该在Microsoft Connect上报告这个问题。 - Joannes Vermorel
5个回答

2

我也遇到了完全相同的问题(在.NET 3.5中),但是似乎在.NET 4.0中已经修复了。 - shamp00

2
最好的方法是仅在安装期间加密app.config部分。将安装程序类添加到您的项目中,并覆盖类中的Install方法。在此方法中,您应该执行加密操作。您必须在重写的Install方法末尾调用base.Install。在设置项目中,转到自定义操作并找到要与包含安装程序类实现定义的您的项目输出[exe或程序集]指向的安装自定义操作。这样它将直接在安装期间加密您的app.Config部分,您将不会遇到此问题。应用程序将自动使用DPAPI提供程序通过部分或设置进行读/写。

+1个好建议。这里有一个例子:http://www.codeproject.com/KB/security/ProtectedConfigWinApps.aspx - JohnB
@this. __curious_geek谢谢。有没有办法使用预构建/后构建事件来应用此技术,而不是使用Installer类? - Zujaj Misbah Khan

1

供您参考,问题在于尝试加密配置部分的进程没有管理员权限。我将该进程添加到管理员组中,问题得以解决。


1

今天我遇到了同样的问题。通常,每当我启动一个配置文件被加密的应用程序时,我总是在启动时检查配置文件以确定它是否受保护。如果没有,我就会按照标准的SectionInformation.ProtectSection方法进行操作。这通常是我的第一步,但今天出于某种原因,我决定在执行保护检查之前从配置文件中引用一些内容,结果得到了“未识别的属性'configProtectionProvider'。请注意,属性名称区分大小写。”错误。你只需要在正常代码中引用配置文件之前运行保护代码,就不会再出现这个错误了。


0

尝试在单独的应用程序域中运行您的Exe。一旦您的应用程序在新的AppDomain中加载,检查部分是否已加密。如果没有,则加密该部分并触发AppDomain卸载和重新加载您的可执行文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接