Question

J'ai une application web avec une section de configuration personnalisée. Cette section contient des informations I'ld à crypter (espérait utiliser aspnet_regiis plutôt que de le faire moi-même).

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>

Le gestionnaire de configuration fonctionne très bien avant d'essayer de le chiffrer. Lorsque je tente de le chiffrer avec:

  

aspnet_regiis -pef "MyCustomSection"   c: \ inetpub \ wwwroot \ MyWebSite -PROV   DataProtectionConfigurationProvider

Je reçois une erreur:

  

section de configuration Encrypting ... Une   Erreur créant le   gestionnaire de section de configuration pour   MyCustomSection: Impossible de charger le fichier   ou ensemble « MyAssembly » ou un de ses   dépendances. Le système ne peut pas trouver   le fichier spécifié.   (C: \ inetpub \ wwwroot \ MyWebSite \ web.config   ligne 5)

Je l'ai essayé avec / sans le fournisseur configuré. Avec / sans groupes de section. Avec / Sans avoir commencé le site avant la main. Je l'ai essayé de mettre temporairement mon assemblage dans le GAC pour l'enregistrement. J'ai essayé aussi ma section log4net juste pour essayer quelque chose qui était pas le mien, avec pas de chance. J'ai couru l'invite de commande en tant qu'administrateur. Des idées? Ou peut aspnet_regiis tout simplement pas être utilisé pour les sections personnalisées?

Un dernier coup après avoir vu MSDN changeait mon gestionnaire d'hériter de ConfigurationSection plutôt que la mise en œuvre IConfigurationSectionHandler car il était techniquement obsolète dans la version 2.0 (en espérant qu'il avait quelque chose en ce qui concerne la version aspnet_regiis). Pas de chance non plus.

Toutes les idées me le faire savoir. Merci!

Était-ce utile?

La solution

aspnet_regiis doit être capable de se lier à l'ensemble. Les règles contraignantes normales .net s'appliquent.

Je contourner ce problème en créant répertoire appelé aspnet_regiis_bin dans le même répertoire que aspnet_regiis.exe et un fichier aspnet_regiis.exe.config avec aspnet_regiis_bin comme un chemin privé comme celui-ci:

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

Je copie alors les ensembles qui définissent les sections de configuration personnalisée dans aspnet_regiis_bin afin que aspnet_regiis puisse les trouver.

Cette procédure ne nécessite pas les assemblées à forte nommés ou dans le GAC, mais ne nécessite déconner dans les répertoires cadres.

Autres conseils

J'utilise une solution de contournement dans lequel je commente temporarly le contenu de l'élément configSections:

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

Vous pouvez ensuite exécuter le chiffrement en utilisant aspnet_regiis -pef comme d'habitude. Après cela, il suffit d'exécuter a décommenter la section et votre site est prêt à fonctionner.

Ceci est un hack total, mais je ne suis pas sûr qu'il ya une autre façon de le faire sans nommer fortement l'assemblée qui définit votre section personnalisée et GACifying (bien que vous avez mentionné que ne fonctionne pas non plus, et je m ne sais pas pourquoi il ne serait pas). Depuis aspnet_regiis fonctionne dans le répertoire : \ Windows \ Microsoft.Net \ Framework \ dossier (dans Windows XP), vous pouvez copier la DLL qui définit votre section de configuration dans le cadre pertinent \ dossier, puis il devrait fonctionner.

Pour mémoire, je me suis retrouvé avec une petite page de maintenance pour le faire pour moi.

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

Avertissements: Votre processus aura besoin d'accès en écriture aux fichiers de configuration en cours de modification. Vous voulez une certaine façon d'autoriser qui peut exécuter ce. Vous généralement redémarrer le site lors de l'enregistrement.

La réponse qui apparaît comme correcte est correcte. Je voulais ajouter un commentaire, mais ne pouvait pas parce que cela est trop long d'un commentaire (exemples d'entrées de configuration).

Le nom de la section doit utiliser le nom complet des assemblées. Une qualification de montage d'exécution ne fonctionne pas avec aspnet_regiis.exe.

Cela fonctionne:

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

Mais cela NE FONCTIONNE:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top