28

Ich habe eine Webanwendung mit einem benutzerdefinierten Konfigurationsabschnitt. Dieser Abschnitt enthält Informationen, die ich gerne verschlüsseln würde (ich wollte ASPNet_RegIIS verwenden, anstatt es selbst zu tun).Verwenden von ASPNet_Regis zum Verschlüsseln des benutzerdefinierten Konfigurationsabschnitts - können Sie das 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

bekomme ich einen Fehler:

Encrypting configuration section... An error occurred creating the configuration section handler for MyCustomSection: Could not load file or assembly 'MyAssembly' or one of its dependencies. The system cannot find the file specified. (c:\inetpub\wwwroot\MyWebsite\web.config line 5)

Ich habe versucht, mit/ohne den Provider konfiguriert. Mit/ohne Abschnittsgruppen. Mit/ohne vorher die Website gestartet zu haben. Ich habe versucht, meine Assembly vorübergehend für die Registrierung in den GAC zu stellen. Ich habe auch meinen log4net-Bereich ausprobiert, nur um etwas zu versuchen, das nicht mein war, ohne Glück. Ich habe die Eingabeaufforderung als Administrator ausgeführt. Irgendwelche Ideen? Oder kann ASPNet_RegIIS einfach nicht für benutzerdefinierte Abschnitte verwendet werden?

Ein letzter Schuss nach der Anzeige MSDN änderte meine Handler von ConfigurationSection zu erben, anstatt IConfigurationSectionHandler zu implementieren, da es in 2.0 technisch veraltet war (in der Hoffnung, es war etwas in Bezug auf aspnet_regiis Version). Auch kein Glück.

Irgendwelche Ideen lassen Sie mich wissen. Vielen Dank!

+0

Ich habe das gleiche Problem. Ich denke nicht, dass es einen Weg gibt, das funktionieren zu lassen, ohne die Assembly in den gac oder den Hack in der Antwort unten zu setzen. –

+0

Ich war es leid, damit zu spielen - also ging ich einfach mit der Montage der Baugruppe in den gac vorübergehend. –

Antwort

29

aspnet_regiis müssen in der Lage sein, die Baugruppe zu binden. Es gelten die normalen .net-Bindungsregeln.

ich dies umgehen, indem Verzeichnis 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 genannt zu schaffen:

<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 definieren in aspnet_regiis_bin, so dass aspnet_regiis sie finden können.

Diese Prozedur erfordert nicht, dass die Assembly stark benannt oder in der GAC verwendet wird, sondern in den Framework-Verzeichnissen herumgemischt werden muss.

+0

Könnten Sie bitte antworten http://stackoverflow.com/questions/786661/using-aspnet-regiis-to-encrypt-custom-configuration-section-can-you-doit-it? – Lijo

+3

Genie !! Hinweis: Stellen Sie sicher, dass Sie diese Datei in den Ordner C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ installieren, nicht den Ordner Framework64. –

4

Dies ist ein totaler Hack, aber ich bin mir nicht sicher, ob es einen anderen Weg gibt, ohne die Assembly zu benennen, die Ihren benutzerdefinierten Abschnitt definiert und ihn gazifiziert (obwohl Sie erwähnt haben, dass es nicht funktioniert hat und ich bin mir nicht sicher warum es nicht wäre. Da aspnet_regiis im Ordner < Laufwerk>: \ Windows \ Microsoft.Net \ Framework \ < Version (in WinXP) ausgeführt wird, können Sie die DLL, die Ihren Konfigurationsabschnitt definiert, in den entsprechenden Ordner Framework \ < Version> kopieren sollte arbeiten.

+1

Es wurde mit einem starken Namen unterzeichnet, als ich es in den GAC verschoben habe. Ich habe auch sichergestellt, dass ich den Schlüssel version/culture/public in meine Konfiguration/section.type einfüge. Deine Lösung hat mich jedoch durchgebracht, danke. Wenn jemand anderes dies jemals passiert, habe ich am Ende die DLL in den Framework-Ordner verschoben, wie die Antwort schlägt dann aspnet_regiis als Administrator (Windows Server 2007). –

+0

Nachdem ich weiter herumgespielt habe, habe ich es vom GAC registrieren lassen. Ich habe nie versucht, mich beim GAC zu registrieren und gleichzeitig das lange Formular im Typ zu verwenden (obwohl ich beides zu unterschiedlichen Zeiten gemacht habe). Nach dem Nachdenken macht es durchaus Sinn, dass die Baugruppe im GAC sein muss. Danke noch einmal. –

+0

Ehrfürchtig. Ich hatte auch Probleme damit. –

2

Die Antwort, die als richtig angezeigt wird, ist korrekt. Ich wollte einen Kommentar hinzufügen, konnte dies aber nicht, da dieser Kommentar zu lang ist (Beispiel Konfigurationseinträge).

Der Abschnittsname sollte den vollständigen Namen der Assemblys verwenden. Eine Laufzeitassemblyqualifizierung funktioniert nicht mit aspnet_regiis.exe.

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> 
13

ich eine Abhilfe bin mit wobei ich temporarly den Inhalt des configSections Element auf Kommentar:

<configSection> 
    <!-- 
    <section name="CustomSection" type="" /> 
    --> 
</configSection> 

Sie können die Verschlüsselung dann wie gewohnt mit ausführen. Nachdem dies ausgeführt wurde, entfernen Sie einfach den Kommentar aus dem Abschnitt und Ihre Site ist bereit zum Ausführen.

+0

Vielen Dank. Ich war in der Lage, den Prozess zu automatisieren, indem ich Ihren Vorschlag verwendete (einige Powershell kommentiert den Abschnittsnamen, dann läuft aspnet_regiis und dann werden die Kommentare wieder über Powershell entfernt). –

3

Für die Aufzeichnung, endete ich mit einer kleinen Wartungsseite, um dies 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(); 
} 

Vorbehalte: Ihr Prozess benötigt Schreibzugriff auf die zu ändernden Konfigurationsdateien. Sie werden eine Möglichkeit benötigen, um zu autorisieren, wer das ausführen kann. Sie werden generally die Website neu starten, wenn Sie speichern.

Verwandte Themen