Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

app.config / user.config und RSA

34 views
Skip to first unread message

Michael Tischer

unread,
Jan 10, 2007, 10:25:29 AM1/10/07
to
Hallo zusammen

Ich bastel nun schon den ganzen Tag rum und komme auf keinen grünen
Zweig. Im Framework 2.0 gibt es ja die nette Möglichkeit, Einstellungen
in der app.config / user.config verschlüsseln zu lassen. Ich wollte das
eigentlich verwenden, um den ConnectionString sicher zu hinterlegen.
(Wegen Passwort). Nur funktioniert leider selbst mein einfacher
Beispielcode nicht. Im Netz finde ich nur einen Haufen Kram zu ASP.NET.
Vielleicht kann mir ja jemand auf die Sprünge helfen.

private void button1_Click(object sender, EventArgs e) {
//Konfiguration holen
//Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);


ConfigurationSection sec = config.AppSettings;
Properties.Settings.Default.TestEntry = "Alles Mist";
Properties.Settings.Default.Save();

//RSA-Provider
string provider = "RsaProtectedConfigurationProvider";

if(!sec.SectionInformation.IsProtected) {
sec.SectionInformation.ProtectSection(provider);
sec.SectionInformation.ForceSave=true;
config.Save(ConfigurationSaveMode.Full);
}
}

Benutze ich ConfigurationUserLevel.None läuft alles durch. Es passiert
aber nichts. Die Datei ist in keiner Weise verschlüsselt. Benutze ich
ConfigurationUserLevel.PerUserRoamingAdnLocal schmiert das Programm ab,
da die Einstellungen gesperrt seien. Ich komme einfach nicht weiter.

MfG
Michael Tischer

Frank Dzaebel

unread,
Jan 10, 2007, 12:22:22 PM1/10/07
to
Hallo Michael,

[app.config / user.config und RSA]

Mal ein paar Grund-Infos dazu:

- "app.config" - Werte sind standardmässig *nicht*
über "Properties.Settings.Default" beschreibbar,
denn diese sind nur mit einem "get{...}" ausgestattet.
Die Werte sind mit der DropDownbox: "Anwendung"
in der Spalte Bereich unter dem Settings-Designer
assoziiert! Die "app.config" liegt normal im
Anwendungsverzeichnis.

- "user.config" ist mit der DropDownBox "Benutzer"
in der Spalte Bereich unter dem Settings-Designer
assoziiert. Die "user.config" liegt auch unterhalb des
%userprofile%.

> ConfigurationSection sec = config.AppSettings;
> Properties.Settings.Default.TestEntry = "Alles Mist";

Hieran merkt man schon, dass Du das hier
falsch machst. Um "TestEntry" setzen zu können,
musst Du schon eine "Benutzer"-Semantik im Settings-
Designer eingestellt haben. *Dann* ist aber
die ApplicationSettings Section ggf. gar nicht vorhanden,
denn die Werte sind in den "userSettings"!
Viele Worte ... mal ein funktionsfähiger Code:

Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
ConfigurationSectionGroup group = config.GetSectionGroup("userSettings");
ConfigurationSection sec = group.Sections[0];
string provider = "RsaProtectedConfigurationProvider";
Properties.Settings.Default.TestEntry = "Alles gut ;-)";
sec.SectionInformation.UnprotectSection();
if (!sec.SectionInformation.IsProtected)
{ sec.SectionInformation.ProtectSection(provider);
sec.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
}
// Process.Start("notepad", config.FilePath);


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Michael Tischer

unread,
Jan 11, 2007, 7:58:36 AM1/11/07
to
Hallo Frank,

vielen Dank für den korrigierten Code der einige Aha-Erlebnisse
ausgelöst hat. ;-) Die _theoretischen_ Grundlagen wo welche
.config-Datei abgelegt wird, habe ich schon verstanden. (Guten Artikel
irgendwo im Netz gefunden) Was sich mir nicht erschlossen hat, war die
Verwendung im Code. Der geschickte Code war nur einer von mehreren
Versuchen.

In einem vorherigen Beispiel habe ich stets versucht über

ConfigurationSection con = config.GetSection("userSettings");

die Settings zu erreichen und bekam immer nur null zurück. Mir ist
irgendwie der Unterschied zwischen Sections und SectionGroups etc. nicht
klar. Das Configuration-Objekt kann direkt auf AppSettings und
ConnectionStrings zugreifen, für die UserSettings muss ich erst eine
SectionGroup öffnen?

Hat jemand unter Umständen einen Link parat der diese Zusammenhänge
verständlich etwas näher erläutert?

Besten Dank.

MfG
Michael Tischer

Frank Dzaebel

unread,
Jan 11, 2007, 11:51:44 AM1/11/07
to
Hallo Michael,

> vielen Dank für den korrigierten Code der einige
> Aha-Erlebnisse ausgelöst hat. ;-)

Das freut mich.


> Mir ist irgendwie der Unterschied zwischen Sections und
> SectionGroups etc. nicht klar.

Ziemlich simpel.
SectionGroups sind ~vereinfacht der ParentNode der Sections.
SectionGroups sind eine Gruppierung verwandter Abschnitte, in
der mehrere ConfigurationSection's oder eben wieder
ConfigurationSectionGroup's enthalten sein können.

Das korrespondiert hier mit dem <userSettings> Tag in der
"user.config". Interessant sicher auch, wenn Du vor dem
"config.Save()" mal:
group.ForceDeclaration(true);
ausführst, kannst Du vielleicht die Struktur im "user.config"
schon besser sehen. Oder mal:
sec.SectionInformation.ConfigSource = "meine.config";
vor dem Sichern ausführen. Eine kleine Schatztruhe ;-)

> Das Configuration-Objekt kann direkt auf AppSettings und
> ConnectionStrings zugreifen, für die UserSettings muss ich erst eine
> SectionGroup öffnen?

Es gibt eine ganze Menge von Sections, auf die nicht
direkt, sondern nur über einen String zugegriffen werden kann.
Das siehst Du recht einfach über:

StringBuilder allSections = new StringBuilder();
foreach (ConfigurationSection cs in config.Sections)
allSections.AppendLine(cs.SectionInformation.Name);
MessageBox.Show("Sections:\r\n" + allSections);

StringBuilder allSectionGroups = new StringBuilder();
foreach (ConfigurationSectionGroup csg in config.SectionGroups)
allSectionGroups.AppendLine(csg.SectionGroupName);
MessageBox.Show("SectionGroups:\r\n" + allSectionGroups);

Dennoch kannst Du ja auf die UserSettings (in Deinem
Roaming-Szenario) eben einfach über
Properties.Settings.Default.****
zugreifen, nur in Deinem Fall wünscht Du ja die
komplette Verschlüsselung der *ganzen* Section
(mit ProtectSection), da muss die eben erstmal "geholt" werden.

Michael Tischer

unread,
Jan 12, 2007, 7:59:57 AM1/12/07
to
Hallo Frank

Jetzt ist mir vieles klar geworden. Vielen Dank nochmal.

MfG
Michael Tischer

0 new messages