Pergunta

Tenho uma aplicação web com uma seção de configuração personalizada. Essa seção contém informações I'ld como para criptografar (estava esperando para usar Aspnet_regiis em vez de fazê-lo eu mesmo).

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>

A configuração manipulador funciona muito bem antes de tentar para criptografá-lo. Quando tento criptografá-lo com:

aspnet_regiis -pef "MyCustomSection" c: \ inetpub \ wwwroot \ MyWebSite -PROV DataProtectionConfigurationProvider

Eu recebo um erro:

seção de configuração Criptografia ... An Erro criando o manipulador de seção de configuração para MyCustomSection: não foi possível carregar arquivo ou montagem 'MyAssembly' ou um dos seus dependências. O sistema não pode encontrar o arquivo especificado. (C: \ inetpub \ wwwroot \ MyWebSite \ web.config linha 5)

Eu tentei com / sem o provedor configurado. Com / sem grupos de seção. Com / sem ter iniciado o site antes da mão. Eu tentei colocar temporariamente o meu assembly no GAC para o registo. Eu também tentei a minha seção log4net apenas para tentar algo que não era meu, sem sorte. Eu executar o prompt de comando como administrador. Alguma ideia? Ou pode Aspnet_regiis não apenas ser usado para seções personalizadas?

Um tiro final depois de ver MSDN estava mudando meu manipulador para herdar de ConfigurationSection em vez de implementar IConfigurationSectionHandler desde que foi tecnicamente obsoleto em 2,0 (esperando que fosse algo a respeito aspnet_regiis versão). Sem sorte lá também.

Todas as ideias me avise. Obrigado!

Foi útil?

Solução

aspnet_regiis deve ser capaz de se ligar a montagem. As regras vinculativas .net normais se aplicam.

Eu contornar isso criando diretório chamado aspnet_regiis_bin no mesmo diretório como aspnet_regiis.exe e um arquivo aspnet_regiis.exe.config com aspnet_regiis_bin como um caminho privado como este:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="aspnet_regiis_bin"/>
      </assemblyBinding>
   </runtime>
</configuration>

Em seguida, copiar os conjuntos que definem as seções de configuração personalizada em aspnet_regiis_bin para que aspnet_regiis pode encontrá-los.

Este procedimento não requer as assembleias de ser forte chamado ou no GAC, mas requer mexer nos diretórios-quadro.

Outras dicas

Eu estou usando uma solução em que eu temporarly comentar o conteúdo do elemento configSections:

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

Você pode então executar a criptografia usando aspnet_regiis -pef como de costume. Após este foi executado apenas remova o comentário da seção e seu site está pronto para ser executado.

Este é um hack total, mas não tenho certeza de que não há outra maneira de fazê-lo sem nomear fortemente o assembly que define sua seção personalizada e GACifying (embora você mencionou que não funcionou, quer, e eu' m não tenho certeza por que ele não faria). Desde Aspnet_regiis é executado na : \ Windows \ Microsoft.Net \ Framework \ pasta (em WinXP), você pode copiar a DLL que define sua seção de configuração para o quadro relevante \ pasta, e então deve funcionar.

Para o registro, eu acabei com um pouco de página de manutenção para fazer isso por mim.

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

Advertências: Seu processo terá acesso de gravação para os arquivos de configuração que está sendo modificado. Você vai querer alguma forma de autorizar quem pode executar esse. Você vai geralmente restart o site quando você salva.

A resposta que é mostrado como correta está correta. Eu queria adicionar um comentário, mas não conseguiu porque este é demasiado longo de um comentário (entradas de configuração de amostra).

O nome da seção deve usar o nome completo das assembléias. A qualificação conjunto de tempo de execução não funciona com aspnet_regiis.exe.

Isso funciona:

<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>

Mas isso não funciona:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top