Mit aspnet_regiis benutzerdefinierten Konfigurationsabschnitt zu verschlüsseln - können Sie es tun?
-
16-09-2019 - |
Frage
Ich habe eine Web-Anwendung mit einem benutzerdefinierten Konfigurationsabschnitt. Dieser Abschnitt enthält Informationen I'ld verschlüsseln mag (hatte gehofft, aspnet_regiis zu verwenden, anstatt es selbst zu tun).
Web.Config:
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<configSections>
<section name="MyCustomSection"
type="MyNamespace.MyCustomSectionHandler, MyAssembly"/>
</configSections>
<configProtectedData>
<providers>
<clear />
<add name="DataProtectionConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="MyKeyContainer"
useMachineContainer="true" />
</providers>
</configProtectedData>
<MyCustomSection>
<blah name="blah1">
<blahChild name="blah1Child1" />
</blah>
</MyCustomSection>
Die Konfiguration Handler funktioniert gut, bevor Sie versuchen, es zu verschlüsseln. Wenn ich versuche, es zu verschlüsseln mit:
aspnet_regiis -pef "MyCustomSection" c: \ inetpub \ wwwroot \ MyWebSite -PROV DataProtectionConfigurationProvider
Ich erhalte eine Fehlermeldung:
Encrypting Konfigurationsabschnitt ... Ein Fehler aufgetreten ist die Schaffung Konfigurationsabschnitt Handler für MyCustomSection: Datei konnte nicht geladen werden oder Assembly ‚MyAssembly‘ oder einem ihrer Abhängigkeiten. Das System kann nicht finden die Datei angegeben. (C: \ inetpub \ wwwroot \ MyWebSite \ web.config Zeile 5)
Ich habe versucht, mit / ohne den Provider konfiguriert. Mit / ohne Abschnittsgruppen. Mit / Ohne die Website vor der Hand zu haben begonnen. Ich habe versucht, meine Assembly im GAC für die Registrierung vorübergehend setzen. Ich meine log4net Abschnitt auch nur versucht, etwas zu versuchen, die nicht von mir, ohne Glück war. Ich habe die Eingabeaufforderung als Administrator ausführen. Irgendwelche Ideen? Oder kann aspnet_regiis einfach nicht für benutzerdefinierte Abschnitte verwendet werden?
Ein letzter Schuss nach der Anzeige MSDN veränderten mein Handler von Configuration eher zu erben als IConfigurationSectionHandler Implementierung, da es technisch in 2.0 veraltet wurde (in der Hoffnung es etwas in Bezug auf aspnet_regiis Version war). Kein Glück gibt es auch nicht.
Alle Ideen, lassen Sie mich wissen. Dank!
Lösung
aspnet_regiis
muss in der Lage sein, um die Montage zu binden. Die normalen .net verbindliche Regeln gelten.
ich dies umgehen, indem Verzeichnis namens aspnet_regiis_bin
im selben Verzeichnis wie aspnet_regiis.exe
und eine aspnet_regiis.exe.config
Datei mit aspnet_regiis_bin
als privatem Pfad so zu erstellen:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="aspnet_regiis_bin"/>
</assemblyBinding>
</runtime>
</configuration>
ich kopieren Sie die Baugruppen, die die benutzerdefinierten Konfigurationsabschnitte in aspnet_regiis_bin
definieren, so dass aspnet_regiis
kann sie finden.
Dieses Verfahren erfordert nicht die Baugruppen stark namentlich genannt zu werden oder im GAC erfordert aber um in dem Rahmen Verzeichnissen durcheinander.
Andere Tipps
Ich bin mit einem Problem zu umgehen, wodurch ich temporarly den Inhalt des configSections Elements Kommentar aus:
<configSection>
<!--
<section name="CustomSection" type="" />
-->
</configSection>
Sie können dann die Verschlüsselung laufen aspnet_regiis -pef
wie gewohnt verwenden. Danach den Abschnitt nur Kommentar- gelaufen ist und Ihre Website ist bereit zu laufen.
Dies ist ein Gesamt Hack, aber ich bin mir nicht sicher, dass eine andere Art und Weise gibt, es zu tun, ohne die Montage stark zu benennen, die Ihre benutzerdefinierten Abschnitt definiert und GACifying es (obwohl Sie erwähnt, dass nicht funktioniert, entweder, und ich m nicht sicher, warum es würde nicht). Da aspnet_regiis läuft im
Für die Aufzeichnung beenden ich mit einer wenig Wartung der Seite für mich zu tun.
var currentConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/");
// Unprotect
ConfigurationSection section = currentConfig.GetSection("MyCustomSection");
if (section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
currentConfig.Save();
}
// Protect
if (!section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
currentConfig.Save();
}
Caveats: Ihr Prozess wird Schreibzugriff auf die Konfigurationsdateien müssen geändert werden. Sie werden einen Weg autorisieren möchten, die diese ausführen können. Sie werden im Allgemeinen neu starten, wenn Sie speichern.
Die Antwort, die als richtig dargestellt wird, ist korrekt. Ich wollte einen Kommentar hinzufügen, aber konnte nicht, weil das ist zu lang ein Kommentar (Beispielconfig Einträge).
Der Abschnitt Name den vollständigen Namen der Baugruppen verwenden sollten. Eine Runtime-Assembly Qualifikation nicht mit aspnet_regiis.exe arbeiten.
Das funktioniert:
<configSections>
<section name="securityConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, Microsoft.Practices.EnterpriseLibrary.Security, Version=5.0.414.0, Culture=neutral, PublicKeyToken=9c844884b2afcb9e" />
</configSections>
Aber das funktioniert nicht:
<configSections>
<section name="securityConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, Microsoft.Practices.EnterpriseLibrary.Security" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="Microsoft.Practices.EnterpriseLibrary.Security" fullName="Microsoft.Practices.EnterpriseLibrary.Security, Version=5.0.414.0, Culture=neutral, PublicKeyToken=9c844884b2afcb9e" />
</assemblyBinding>
</runtime>