2009-03-23 12 views
5

Ich habe eine Anwendung, die einen Abschnitt in der Konfigurationsdatei verschlüsselt. In der ersten Zeit, die ich versuche, den verschlüsselten Abschnitt aus der Konfigurationsdatei ich eine Fehlermeldung zu lesen: „Nicht erkennen Attribut‚configProtectionProvider‘Beachten Sie, dass Attributnamen zwischen Groß- und Kleinschreibung.“App.config - verschlüsselten Abschnitt Fehler:

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

Dies geschieht nur in das erste Mal, dass ich versuche, den verschlüsselten Abschnitt zu lesen. Ich habe festgestellt, dass die .config-Datei sofort nach dem ersten Speichern aktualisiert wird, aber aus irgendeinem Grund muss ich die Anwendung neu starten, um den verschlüsselten Abschnitt zu verwenden.

+0

Hum, das Ändern von Konfigurationsdateien zur Laufzeit ist keine typische Verwendung. Sie sollten das Problem möglicherweise in Microsoft Connect melden. –

Antwort

1

Zu Ihrer Information war das Problem, dass der Prozess, der versuchte, den Konfigurationsabschnitt zu verschlüsseln, keine Administratorrechte hatte. Ich habe diesen Prozess der Administratorengruppe hinzugefügt und das hat es gelöst.

2

Der beste Weg, dies zu tun, wird die app.config Abschnitte nur während der Installation zu verschlüsseln. Fügen Sie Ihrem Projekt eine Installer-Klasse hinzu und überschreiben Sie die Install-Methode in der Klasse. In dieser Methode sollten Sie die Verschlüsselung durchführen. Sie müssen base.Install am Ende Ihrer überschriebenen Install-Methode aufrufen. Rufen Sie im Setup-Projekt die Option Benutzerdefinierte Aktionen auf, und suchen Sie nach der benutzerdefinierten Aktion Installieren, die auf Ihre Projektausgabe [exe oder assembly] verweist, die die Definition der Implementierung Ihrer Installer-Klasse enthält. Auf diese Weise wird Ihre App.Config Abschnitte während einer Installation zu verschlüsseln und Sie werden dieses Problem nicht haben. Die Anwendung verwendet den DPAPI-Provider automatisch zum Lesen/Schreiben von Abschnitten oder Einstellungen.

Hoffe, das hilft.

Danke.

Ruchit S.

+0

+1 guter Vorschlag. Hier ein Beispiel: http://www.codeproject.com/KB/security/ProtectedConfigWinApps.aspx – JohnB

0

Versuchen Sie, Ihre Exe in separaten Anwendungsdomäne ausgeführt wird. Sobald Ihre Anwendung in die neue Anwendungsdomäne geladen wurde, überprüfen Sie, ob die Abschnitte verschlüsselt sind oder nicht. Wenn nicht, dann verschlüsseln Sie den Abschnitt und triggern Sie die AppDomain zum Entladen und erneutem Laden mit Ihrer ausführbaren Datei.

1

Ich lief gerade in das gleiche Problem heute. Normalerweise, wenn ich eine Anwendung starte, bei der die Konfiguration verschlüsselt ist, überprüfe ich immer die Konfiguration beim Start, um festzustellen, ob sie geschützt ist. Wenn nicht, dann folge ich der Methode SectionInformation.ProtectSection. Dies ist immer mein erster Schritt, aber heute habe ich aus irgendeinem Grund beschlossen, etwas aus der Konfiguration zu referenzieren, bevor ich meine Schutzprüfung durchgeführt und das "Unbekannte Attribut 'configProtectionProvider' erhalten habe. Beachten Sie, dass Attributnamen Groß- und Kleinschreibung beachten." Alles, was Sie tun müssen, ist, einen Schutzcode auszuführen, bevor Sie in Ihrem normalen Code auf die Konfiguration verweisen, und Sie haben den Fehler nicht mehr.