Использование ASPNet_Regiis для шифрования пользовательского раздела конфигурации - вы можете это сделать? - PullRequest
29 голосов
/ 24 апреля 2009

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

Я получаю сообщение об ошибке:

Шифрование раздела конфигурации ... An произошла ошибка при создании обработчик раздела конфигурации для MyCustomSection: не удалось загрузить файл или сборка "MyAssembly" или один из его зависимостей. Система не может найти указанный файл (C: \ Inetpub \ Wwwroot \ МойВебСайт \ web.config строка 5)

Я пробовал с / без настроенного провайдера. С / без групп разделов. С / без того, что запустил сайт заранее. Я попытался временно поместить свою сборку в GAC для регистрации. Я также попробовал свой раздел log4net только для того, чтобы попробовать что-то, что не было моим, без удачи. Я запустил командную строку от имени администратора. Есть идеи? Или же ASPNet_RegIIS просто нельзя использовать для пользовательских разделов?

Последний снимок после просмотра MSDN изменял мой обработчик на наследование от ConfigurationSection, а не на реализацию IConfigurationSectionHandler, поскольку технически устарел в 2.0 (надеясь, что это что-то касается версии aspnet_regiis). Там тоже не повезло.

Любые идеи, дайте мне знать. Спасибо!

Ответы [ 5 ]

31 голосов
/ 16 июня 2011

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, но требует возни в каталогах каркаса.

16 голосов
/ 19 июля 2013

Я использую обходной путь, посредством которого я временно закомментирую содержимое элемента configSections:

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

Затем вы можете запустить шифрование, используя aspnet_regiis -pef как обычно. После этого просто раскомментируйте раздел, и ваш сайт готов к работе.

4 голосов
/ 24 апреля 2009

Это полный взлом, но я не уверен, что есть другой способ сделать это, не называя сборку, которая определяет ваш пользовательский раздел, и GAC ее (хотя вы упомянули, что это тоже не сработало, и я ' Я не уверен, почему это не так). Поскольку aspnet_regiis работает в папке : \ Windows \ Microsoft.Net \ Framework \ (в WinXP), вы можете скопировать библиотеку DLL, которая определяет раздел конфигурации, в соответствующую папку Framework \ , а затем должно работать.

3 голосов
/ 19 июля 2013

Для справки, у меня появилась небольшая страница поддержки, чтобы сделать это для меня.

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();
}

Предупреждения: Вашему процессу потребуется доступ на запись в изменяемые файлы конфигурации. Вы хотите какой-то способ авторизовать, кто может это запустить. При сохранении вы будете обычно перезагружать веб-сайт.

2 голосов
/ 24 января 2012

Ответ, который показан как правильный, является правильным. Я хотел добавить комментарий, но не смог, потому что это слишком длинный комментарий (примеры записей конфигурации).

В имени раздела должно использоваться полное имя сборок. Квалификация сборки во время выполнения не работает с 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>
...