Domanda

Ho un'applicazione web con una sezione di configurazione personalizzata.Quella sezione contiene informazioni che vorrei crittografare (speravo di utilizzare ASPNet_RegIIS anziché farlo da solo).

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 benissimo prima di provare a crittografarlo.Quando provo a crittografarlo con:

aspnet_regiis -pef "mycustomesction" c: inetpub wwwroot mywebsite -prov dataprotectionconfigurationprovider

Ottengo un errore:

Sezione di configurazione di crittografia...Si è verificato un errore creando il gestore della sezione di configurazione per mycustomesction:Impossibile caricare file o assemblaggio "myassembly" o una delle sue dipendenze.Il sistema non trova il file specificato.(C: inetpub wwwroot mywebsite web.config riga 5)

Ho provato con/senza il provider configurato.Con/senza gruppi di sezioni.Con/Senza aver avviato il sito web in anticipo.Ho provato a mettere temporaneamente il mio assembly nel GAC per la registrazione.Ho provato anche la mia sezione log4net solo per provare qualcosa che non fosse mio, senza fortuna.Ho eseguito il prompt dei comandi come amministratore.Qualche idea?Oppure ASPNet_RegIIS non può essere utilizzato semplicemente per sezioni personalizzate?

Un ultimo scatto dopo la visione MSDN stavo cambiando il mio gestore per ereditare da ConfigurationSection anziché implementare IConfigurationSectionHandler poiché era tecnicamente deprecato nella 2.0 (sperando che fosse qualcosa riguardante la versione aspnet_regiis).Nessuna fortuna neanche lì.

Qualsiasi idea fatemelo sapere.Grazie!

È stato utile?

Soluzione

aspnet_regiis deve essere in grado di associare l'assembly.Si applicano le normali regole vincolanti di .net.

Risolvo questo problema creando una directory chiamata aspnet_regiis_bin nella stessa directory di aspnet_regiis.exe e un aspnet_regiis.exe.config file con aspnet_regiis_bin come percorso privato come questo:

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

Quindi copio gli assembly che definiscono le sezioni di configurazione personalizzata in aspnet_regiis_bin affinché aspnet_regiis li può trovare.

Questa procedura non richiede che gli assembly abbiano un nome sicuro o siano presenti nel GAC, ma richiede di fare confusione nelle directory del framework.

Altri suggerimenti

Sto utilizzando una soluzione alternativa in base alla quale commento temporaneamente il contenuto dell'elemento configSections:

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

È quindi possibile eseguire la crittografia utilizzando aspnet_regiis -pef come di solito.Dopo averlo eseguito, rimuovi il commento dalla sezione e il tuo sito è pronto per essere eseguito.

Questo è un hack totale, ma non sono sicuro che ci sia un altro modo per farlo senza nominare in modo forte l'assembly che definisce la tua sezione personalizzata e GACificandolo (anche se hai detto che non ha funzionato, e non ne sono sicuro perché non dovrebbe).Poiché aspnet_regiis viene eseguito nella cartella < unità >:\Windows\Microsoft.Net\Framework\< versione > (in WinXP), puoi copiare la DLL che definisce la sezione di configurazione nella cartella Framework\< versione > pertinente, quindi dovrebbe funzionare.

Per la cronaca, mi sono ritrovato con una piccola pagina di manutenzione che faceva 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 tuo processo avrà bisogno dell'accesso in scrittura ai file di configurazione da modificare.Avrai bisogno di un modo per autorizzare chi può eseguirlo.Lo farai generalmente riavvia il sito Web quando salvi.

La risposta che viene visualizzata come corretta è corretta.Volevo aggiungere un commento ma non ho potuto perché è un commento troppo lungo (voci di configurazione di esempio).

Il nome della sezione deve utilizzare il nome completo degli assembly.Una qualifica di 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top