Использование ASPNet_Regiis для шифрования раздела пользовательской конфигурации – можете ли вы это сделать?

StackOverflow https://stackoverflow.com/questions/786661

Вопрос

У меня есть веб-приложение с разделом настраиваемой конфигурации.Этот раздел содержит информацию, которую я хотел бы зашифровать (я надеялся использовать 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top