Использование ASPNet_Regiis для шифрования раздела пользовательской конфигурации – можете ли вы это сделать?
-
16-09-2019 - |
Вопрос
У меня есть веб-приложение с разделом настраиваемой конфигурации.Этот раздел содержит информацию, которую я хотел бы зашифровать (я надеялся использовать ASPNet_RegIIS, а не делать это самостоятельно).
Веб.Конфигурация:
<?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>
Обработчик конфигурации отлично работает, прежде чем пытаться его зашифровать.Когда я пытаюсь зашифровать его с помощью:
aspnet_regiis -pef "mycustomsection" c: inetpub wwwroot mywebsite -prov DataProtectionConfigurationProvider
Я получаю сообщение об ошибке:
Раздел конфигурации шифрования...Произошла ошибка, создавая обработчик секции конфигурации для MyCustomsection:Не удалось загрузить файл или сборку «myassembly» или одну из его зависимости.Система не может найти указанный файл.(C: inetpub wwwroot mywebsite web.config Line 5)
Я пробовал с настроенным провайдером или без него.С/без групп разделов.С/без предварительного запуска сайта.Я попытался временно разместить свою сборку в GAC для регистрации.Я также попробовал свой раздел log4net, просто чтобы попробовать что-то чужое, но безуспешно.Я запустил командную строку от имени администратора.Есть идеи?Или ASPNet_RegIIS нельзя использовать для пользовательских разделов?
Последний кадр после просмотра MSDN менял свой обработчик, чтобы он наследовал от ConfigurationSection, а не реализовывал IConfigurationSectionHandler, поскольку он технически устарел в версии 2.0 (надеюсь, что это связано с версией aspnet_regiis).Там тоже не повезло.
Любые идеи, дайте мне знать.Спасибо!
Решение
aspnet_regiis
должен иметь возможность связать сборку.Применяются обычные правила привязки .net.
Я обхожу это, создавая каталог с именем aspnet_regiis_bin
в том же каталоге, что и aspnet_regiis.exe
и aspnet_regiis.exe.config
файл с aspnet_regiis_bin
как частный путь, например:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="aspnet_regiis_bin"/>
</assemblyBinding>
</runtime>
</configuration>
Затем я копирую сборки, определяющие разделы пользовательской конфигурации, в aspnet_regiis_bin
так что aspnet_regiis
смогу их найти.
Эта процедура не требует, чтобы сборки имели строгие имена или находились в GAC, но требует работы в каталогах инфраструктуры.
Другие советы
Я использую обходной путь, при котором я временно комментирую содержимое элемента configSections:
<configSection>
<!--
<section name="CustomSection" type="" />
-->
</configSection>
Затем вы можете запустить шифрование, используя aspnet_regiis -pef
по-прежнему.После запуска просто раскомментируйте раздел, и ваш сайт готов к работе.
Это полный хак, но я не уверен, что есть другой способ сделать это без строгого указания сборки, которая определяет ваш пользовательский раздел, и ее GAC-фикации (хотя вы упомянули, что это тоже не сработало, и я не уверен) почему бы и нет).Поскольку aspnet_regiis запускается в папке <диск>:\Windows\Microsoft.Net\Framework\<версия> (в WinXP), вы можете скопировать DLL, определяющую ваш раздел конфигурации, в соответствующую папку Framework\<версия>, а затем должно сработать.
Для справки: в итоге у меня появилась небольшая страница обслуживания, которая сделала это за меня.
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();
}
Предостережения:Вашему процессу потребуется доступ на запись к изменяемым файлам конфигурации.Вам понадобится какой-то способ разрешить, кто может это запускать.Вы будете в целом перезапустите сайт после сохранения.
Ответ, который показан как правильный, является правильным.Я хотел добавить комментарий, но не смог, потому что комментарий слишком длинный (примеры записей конфигурации).
В названии раздела должно использоваться полное имя сборок.Квалификация сборки во время выполнения не работает с aspnet_regiis.exe.
Это работает:
<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>
Но это НЕ РАБОТАЕТ:
<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>