En utilisant aspnet_regiis pour crypter la section de configuration personnalisée - pouvez-vous le faire?
-
16-09-2019 - |
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!
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
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>