Подтвердить что ты не робот

Использование 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). Не повезло и там.

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

4b9b3361

Ответ 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>