Unrecognized attribute 'configProtectionProvider' af

本文关键字:af configProtectionProvider attribute Unrecognized | 更新日期: 2023-09-27 18:11:55

我在应用程序开始时运行以下方法,将其传递到applicationSettings下的部分:

public static void EncryptConfigSection(string sectionKey)
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSection section = config.GetSection(sectionKey);
        if (section != null)
        {
            if (!section.SectionInformation.IsProtected)
            {
                if (!section.ElementInformation.IsLocked)
                {
                    section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
                    section.SectionInformation.ForceSave = true;
                    config.Save(ConfigurationSaveMode.Full);
                    ConfigurationManager.RefreshSection(sectionKey);
                }
            }
        }
    }

下面是app.config中该部分的示例:

<applicationSettings>
  <Example.Properties.Settings>
    <setting name="Key" serializeAs="String">
      <value>Value</value>
    </setting>
  </Example.Properties.Settings>
</applicationSettings>

当我试图从该部分访问任何设置时,我收到以下错误:

无法识别的属性'configProtectionProvider'

这是一个桌面应用程序,启动时需要加密一些设置,退出时需要解密。

有人有解决这个问题的办法吗?

Unrecognized attribute 'configProtectionProvider' af

我发现这个:http://andybrennan.wordpress.com/2014/06/05/unrecognized-attribute-configprotectionprovider-after-encrypting-app-config/。它解决了问题。

就像博客上写的那样使用这个方法:

private void ResetConfigMechanism()
{
    typeof(ConfigurationManager)
        .GetField("s_initState", BindingFlags.NonPublic |
                                 BindingFlags.Static)
        .SetValue(null, 0);
    typeof(ConfigurationManager)
        .GetField("s_configSystem", BindingFlags.NonPublic |
                                    BindingFlags.Static)
        .SetValue(null, null);
    typeof(ConfigurationManager)
        .Assembly.GetTypes()
        .Where(x => x.FullName ==
                    "System.Configuration.ClientConfigPaths")
        .First()
        .GetField("s_current", BindingFlags.NonPublic |
                               BindingFlags.Static)
        .SetValue(null, null);
}

保存/刷新配置后调用

我设法让Rick Schott的回答工作,有一个重要的警告-您不能使用静态版本的ConfigurationManager。GetSection来检索刷新后的部分—您必须使用Configuration。GetSection。

完整代码:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection section = config.GetSection("passwordSection") as ConfigurationSection;
if (!section.SectionInformation.IsProtected)
{
    // Encrypt the section.
    section.SectionInformation.ProtectSection("DPAPIProtection");
    section.SectionInformation.ForceSave = true;
    config.Save(ConfigurationSaveMode.Modified);
    // The passwords are now encrypted.
    // Refresh the *parent* of the section that your passwords are in.
    ConfigurationManager.RefreshSection("configuration");
    // Now use Configuration.GetManager to retrieve the new password section.
    // This doesn't throw the Configuration Exception :)
    ConfigurationSection section2 = config.GetSection("passwordSection") as ConfigurationSection;
}

根据这篇博客文章,修复方法是在父节点上调用RefreshSection():

RefreshSection("applicationSettings")

无法识别的属性configProtectionProvider

我无法在应用程序运行时加密/解密配置文件并继续读取值。

虽然不是我想要的,但解决这个问题的方法是在应用程序运行之前先加密/解密.config。

这里是另一个方法,我没有做,但看起来很有趣:在.NET app.config文件中加密密码

这篇文章只是拯救了我的一天,只是以防有人需要修复vb和2017

    Private Sub ResetConfigMechanism()
        GetType(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic Or BindingFlags.Static).SetValue(Nothing, 0)
        GetType(ConfigurationManager).GetField("s_configSystem", BindingFlags.NonPublic Or BindingFlags.Static).SetValue(Nothing, Nothing)
        GetType(ConfigurationManager).Assembly.GetTypes().Where(Function(x) x.FullName = "System.Configuration.ClientConfigPaths").First().GetField("s_current", BindingFlags.NonPublic Or BindingFlags.Static).SetValue(Nothing, Nothing)
    End Sub