28

Ho un'applicazione Web con una sezione di configurazione personalizzata. Quella sezione contiene informazioni che mi piacerebbe crittografare (speravo di utilizzare ASPNet_RegIIS piuttosto che farlo da solo).Utilizzo di ASPNet_Regiis per crittografare la sezione di configurazione personalizzata - puoi farlo?

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> 

Il gestore di configurazione funziona alla grande prima di provare a cifrare. Quando provo per cifrare con:

aspnet_regiis -pef "MyCustomSection" c:\inetpub\wwwroot\MyWebsite -prov DataProtectionConfigurationProvider

ottengo un errore:

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)

Ho provato con/senza il provider configurato. Con/senza gruppi di sezioni. Con/senza aver avviato il sito Web prima mano. Ho provato a mettere temporaneamente il mio assembly nel GAC per la registrazione. Ho anche provato la mia sezione log4net solo per provare qualcosa che non era mio, senza fortuna. Ho eseguito il prompt dei comandi come amministratore. Qualche idea? Oppure non è possibile utilizzare ASPNet_RegIIS per le sezioni personalizzate?

Un ultimo scatto dopo la visualizzazione di MSDN stava cambiando il gestore in modo che ereditasse da ConfigurationSection anziché implementare IConfigurationSectionHandler poiché era tecnicamente deprecato in 2.0 (sperando fosse qualcosa riguardante la versione di aspnet_regiis). Non c'è fortuna neanche lì.

Qualsiasi idea me lo faccia sapere. Grazie!

+0

Ho avuto lo stesso problema. Non credo che ci sia un modo per farlo funzionare senza mettere l'assembly nel gac o l'hack nella risposta qui sotto? –

+0

Ero stanco di giocherellare con esso - quindi sono andato solo mettendo temporaneamente il gruppo nel gac. –

risposta

29

aspnet_regiis deve essere in grado di legare il gruppo. Si applicano le normali regole di legame .net.

ottengo intorno a questo con la creazione di directory chiamata aspnet_regiis_bin nella stessa directory di aspnet_regiis.exe e un file aspnet_regiis.exe.config con aspnet_regiis_bin come un sentiero privato come questo:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="aspnet_regiis_bin"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Ho poi copiare gli assembly che definiscono le sezioni di configurazione personalizzate in aspnet_regiis_bin in modo che aspnet_regiis li trovi.

Questa procedura non richiede che gli assembly siano denominati in modo sicuro o nel GAC, ma richiede un po 'di confusione nelle directory framework.

+0

Potresti rispondere http://stackoverflow.com/questions/786661/using-aspnet-regiis-to-encrypt-custom-configuration-section-can-you-do-it? – Lijo

+3

Genius !! NB: Assicurati di inserirlo nella cartella C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \, non nella cartella Framework64 –

4

Questo è un trucco totale, ma non sono sicuro che ci sia un altro modo per farlo senza nominare fortemente l'assembly che definisce la sezione personalizzata e GACifying (anche se hai menzionato che non ha funzionato, sia, sia io non sono sicuro del perché non lo sarebbe). Poiché aspnet_regiis viene eseguito nella cartella <>: \ Windows \ Microsoft.Net \ Framework \ < versione (in WinXP), è possibile copiare la DLL che definisce la sezione di configurazione nella cartella Framework \ < pertinente e quindi dovrebbe funzionare.

+1

È stato firmato con un nome sicuro quando l'ho spostato nel GAC. Mi sono anche assicurato di includere la versione/cultura/chiave pubblica nella mia configurazione/sezione.type. La tua soluzione mi ha aiutato, grazie. Se qualcun altro lo incontra, ho finito per spostare la DLL nella cartella framework come suggerisce la risposta, quindi eseguire aspnet_regiis come amministratore (Windows Server 2007). –

+0

Dopo aver giocato ancora un po 'di casino mi sono fatto registrare dal GAC. Non ho mai provato a registrarmi al GAC e ad usare il modulo lungo nel tipo allo stesso tempo (anche se l'ho fatto entrambi in momenti separati). Dopo aver riflettuto su questo, è perfettamente logico che l'assemblea sia richiesta per essere nel GAC. Grazie ancora. –

+0

Fantastico. Ho avuto qualche problema anche con questo. –

2

La risposta corretta è corretta. Volevo aggiungere un commento ma non potevo perché questo è troppo lungo di un commento (esempi di voci di configurazione).

Il nome della sezione deve utilizzare il nome completo degli assembly. Una qualifica dell'assembly runtime non funziona con aspnet_regiis.exe.

questo funziona:

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

Ma questo NON FUNZIONA:

<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

Sto usando una soluzione per cui ho temporaneamente commentare il contenuto dell'elemento configSections:

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

È quindi possibile eseguire la crittografia utilizzando aspnet_regiis -pef come al solito. Dopo questo è stato eseguito solo un commento della sezione e il tuo sito è pronto per essere eseguito.

+0

Grazie. Sono stato in grado di automatizzare il processo utilizzando il tuo suggerimento (alcuni commenti di Powershell sul nome della sezione, quindi viene eseguito il comando aspnet_regiis e quindi i commenti vengono rimossi nuovamente tramite Powershell). –

3

Per la cronaca, ho finito con una piccola pagina di manutenzione per fare questo per me.

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

Avvertenze: Il vostro processo avrà bisogno di accesso in scrittura ai file di configurazione in corso di modifica. Avrai bisogno di un modo per autorizzare chi può farlo. generally riavvierai il sito Web quando salvi.

Problemi correlati