Использование ASPNet_Regiis для шифрования раздела пользовательской настройки - можете ли вы это сделать?
У меня есть веб-приложение с настраиваемой конфигурацией. Этот раздел содержит информацию, которую я хотел зашифровать (надеялся использовать ASPNet_RegIIS, а не сам).
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>
Обработчик конфигурации отлично работает, прежде чем пытаться его зашифровать. Когда я пытаюсь зашифровать его с помощью:
aspnet_regiis -pef "MyCustomSection" c:\inetpub\wwwroot\MyWebsite -prov DataProtectionConfigurationProvider
Я получаю сообщение об ошибке:
Шифрование раздела конфигурации... произошла ошибка при создании обработчик раздела конфигурации для MyCustomSection: Не удалось загрузить файл или сборку "MyAssembly" или одну из ее зависимостей. Система не может найти указанный файл. (C:\Inetpub\Wwwroot\МойВебСайт\web.config строка 5)
Я попытался с настройкой/без настройки поставщика. С/без групп разделов. С/без начала веб-сайта перед началом работы. Я пробовал временно поставить свою сборку в GAC для регистрации. Я также попробовал свой раздел log4net просто попробовать что-то, что не было моим, без везения. Я запустил командную строку как администратор. Есть идеи? Или ASP.Net_RegIIS просто не может использоваться для пользовательских разделов?
Один последний снимок после просмотра MSDN менял мой обработчик наследовать от ConfigurationSection, а не реализовывать IConfigurationSectionHandler, поскольку он был технически устарел в версии 2.0 ( надеясь, что это что-то касается версии aspnet_regiis). Не повезло и там.
Любые идеи дайте мне знать. Спасибо!
Ответы
Ответ 1
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, но они нуждаются в беспорядке в каталогах фреймов.
Ответ 2
Я использую обходное решение, в соответствии с которым я временно комментирую содержимое элемента configSections:
<configSection>
<!--
<section name="CustomSection" type="" />
-->
</configSection>
Затем вы можете запустить шифрование, используя aspnet_regiis -pef
, как обычно. После этого просто раскомментируйте раздел, и ваш сайт готов к работе.
Ответ 3
Это полный хак, но я не уверен, что есть другой способ сделать это без решительного именования сборки, которая определяет ваш пользовательский раздел и GACifying его (хотя вы упомянули, что это не сработало, и я, я не знаю, почему это не будет). Поскольку aspnet_regiis работает в < диск > :\Windows\Microsoft.Net\Framework\<version> (в WinXP), вы можете скопировать DLL, которая определяет ваш раздел конфигурации в соответствующую Framework\< версии > , а затем он должен работать.
Ответ 4
Для записи у меня была небольшая страница обслуживания, чтобы сделать это для меня.
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();
}
Предостережения: вашему процессу потребуется доступ на запись к изменяемым файлам конфигурации. Вам нужно каким-то образом разрешить, кто может это запустить. Вы вообще перезапустить веб-сайт при сохранении.
Ответ 5
Правильный ответ, который показан правильно. Я хотел добавить комментарий, но не мог, потому что это слишком длинный комментарий (примеры конфигурационных записей).
В названии раздела должно использоваться полное имя сборок. Квалификация сборки времени выполнения не работает с 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>