2011-10-22 17 views
6

que ejecute el siguiente método en el comienzo de mi solicitud pasa en una sección de estar bajo applicationSettings:atributo no reconocido 'configProtectionProvider' después de la encriptación de app.config

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); 
       } 
      } 
     } 
    } 

He aquí un ejemplo de la sección en el app.config :

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

Cuando intento acceder a cualquiera de los ajustes de la sección, recibo el siguiente error:

Unrecognized attribute 'configProtectionProvider'

Esta es una aplicación de escritorio que necesita encriptar algunas configuraciones al iniciar y luego descifrar al salir.

¿Alguien tiene una solución para este problema?

Respuesta

2

yo no era capaz de cifrar/descifrar el archivo de configuración, mientras que la aplicación se ejecute y siga para leer los valores.

Aunque no es lo que quería, la solución al problema fue primero cifrar/descifrar el .config antes de ejecutar la aplicación.

Aquí hay otro enfoque que no lo hice, pero parecía interesante: Encrypting Passwords in a .NET app.config File

3

De acuerdo con esta entrada del blog, la solución es llamar RefreshSection() en la matriz:

RefreshSection("applicationSettings") 

Unrecognized attribute configProtectionProvider

+0

Rick, por desgracia, este no funcionó. No estoy seguro por qué. Intenté de diferentes maneras. Lo único que funciona es si encripto la configuración y luego comienzo la aplicación. –

+0

@GrandMasterT 2 años demasiado tarde, pero logré que la respuesta de Rick funcionara - vea mi respuesta para más detalles :) Además, ¡+1 para Rick por guiarme al lugar correcto! –

3

He conseguido trabajo respuesta de Rick Schott, con una salvedad importante - no se puede utilizar la versión estática de ConfigurationManager.GetSection para recuperar la sección después de la actualización, debe usar Configuration.GetSection en su lugar.

código completo:

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; 
} 
3

he encontrado esto: http://andybrennan.wordpress.com/2014/06/05/unrecognized-attribute-configprotectionprovider-after-encrypting-app-config/. Y soluciona el problema.

sólo tiene que utilizar este método como está escrito en el blog:

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); 
} 

Invóquelo después de guardar/actualizar la configuración.

+0

No soy un gran entusiasta de llamar propiedades privadas y métodos a través de la reflexión, sin embargo, esta solución funciona muy bien y fue la única que solucionó mi problema (esquema de configuración complejo con archivos include y archivo settings.settings en algunos proyectos). Le dio un voto positivo por esta razón. Me aseguré de documentar el uso en mi código y observé que debería volver a probarse cada vez que cambiemos.La versión de NET Framework, para asegurarse de que todavía funciona y para verificar si Microsoft implementó una forma pública de hacer lo mismo. –

0

Este post acaba de salvar mi día y sólo en caso de que alguien necesita una solución en VB y 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 
Cuestiones relacionadas