Utiliser ASPNet Regiis pour chiffrer la section de configuration personnalisée - pouvez-vous le faire?

j'ai une application web avec une section de configuration personnalisée. Cette section contient des informations que j'aimerais crypter (J'espérais 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 j'essaie de le chiffrer avec:

aspnet_regiis-pef " MyCustomSection" c:inetpubwwwrootMyWebsite -prov DataProtectionConfigurationProvider

j'obtiens une erreur:

section de configuration de chiffrement... Un erreur s'est produite de la création de la gestionnaire de section de configuration pour MyCustomSection: ne pouvait pas charger le fichier ou l'assemblage "MyAssembly" ou l'un de ses dépendance. Le système ne trouve pas le fichier spécifié. (c:inetpubwwwrootMyWebsiteweb.config ligne 5)

j'ai essayé avec/sans le prestataire configuré. Avec/sans la section des groupes. Avec/Sans avoir commencé un site web avant de la main. J'ai essayé de mettre temporairement mon assemblée dans le GAC pour l'enregistrement. J'ai aussi essayé ma section log4net juste pour essayer quelque chose qui n'était pas à moi, sans succès. J'ai exécuter l'invite de commande en tant qu'Administrateur. Des idées? Ou est-ce que ASPNet_RegIIS peut tout simplement ne pas être utilisé pour les sections personnalisées?

Un dernier coup après le visionnement MSDN changeait mon gestionnaire pour hériter de la configuration plutôt que implémenter IConfigurationSectionHandler puisqu'il était techniquement obsolète en 2.0 (en espérant que c'était quelque chose concernant la version aspnet_regiis). Pas de chance non plus.

toutes les idées faites-moi savoir. Merci!

28
demandé sur John Hoven 2009-04-24 20:39:16

5 réponses

aspnet_regiis doit pouvoir lier l'ensemble. Les règles obligatoires normales. net s'appliquent.

Je contournerai cela en créant un répertoire appelé aspnet_regiis_bin dans le répertoire aspnet_regiis.exe et aspnet_regiis.exe.config le fichier

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

je copie alors les assemblages qui définissent les sections de configuration personnalisées en aspnet_regiis_bin alors que aspnet_regiis peut les trouver.

cette procédure n'exige pas que les assemblages soient fortement nommés ou le GAC mais ne nécessite pas de modification dans les répertoires framework.

30
répondu hwiechers 2011-06-15 20:02:46

j'utilise une solution de contournement par laquelle je commente temporairement le contenu de l'élément configSections:

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

vous pouvez alors exécuter le cryptage en utilisant aspnet_regiis -pef comme d'habitude. Après cela a couru juste décommentez la section et votre site est prêt à courir.

15
répondu Mathew Paxinos 2013-07-19 01:29:21

C'est un piratage total, mais je ne suis pas sûr qu'il y ait une autre façon de le faire sans nommer fortement l'ensemble qui définit votre section personnalisée et la Gacifier (bien que vous ayez mentionné que cela n'a pas fonctionné, non plus, et je ne suis pas sûr de la raison pour laquelle cela n'aurait pas fonctionné). Depuis aspnet_regiis tourne dans le < drive >: \Windows\Microsoft.Net\Framework\ < version > dossier (dans WinXP), vous pouvez copier la DLL qui définit votre section de configuration dans le dossier Framework\< version > correspondant, puis cela devrait fonctionner.

4
répondu AJ. 2009-04-24 17:21:40

pour info, j'ai fini avec une petite page de maintenance pour faire ça 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();
}

mises en garde: votre processus aura besoin d'un accès en écriture aux fichiers de configuration modifiés. Vous voudrez un moyen d'autoriser qui peut gérer ça. Vous aurez généralement redémarrer le site web lorsque vous Enregistrez.

3
répondu John Hoven 2017-05-23 11:46:39

la réponse est correcte. Je voulais ajouter un commentaire, mais ne pouvait pas parce que c'est trop long d'un commentaire (exemple de config entrées).

le nom de La section doit utiliser le nom complet des assemblées. Une qualification d'assemblage d'exécution ne fonctionne pas avec aspnet_regiis.EXE.

This WORKS:

<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 ça ne marche pas:

<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>
2
répondu Philippe 2012-01-23 20:04:00