36

我有一个带有自定义配置部分的 Web 应用程序。该部分包含我想加密的信息(希望使用 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 第 5 行)

我尝试过配置/不配置提供程序。有/无部分组。有/没有事先启动网站。我已经尝试暂时将我的程序集放在 GAC 中进行注册。我还尝试了我的 log4net 部分,只是为了尝试不属于我的东西,但没有运气。我以管理员身份运行命令提示符。有任何想法吗?或者 ASPNet_RegIIS 不能用于自定义部分?

查看MSDN后的最后一个镜头是将我的处理程序更改为从 ConfigurationSection 继承而不是实现 IConfigurationSectionHandler,因为它在 2.0 中技术上已弃用(希望它与 aspnet_regiis 版本有关)。那里也没有运气。

任何想法让我知道。谢谢!

4

5 回答 5

38

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 中,但确实需要在框架目录中搞乱。

于 2011-06-15T20:02:46.233 回答
19

我正在使用一种解决方法,我暂时注释掉 configSections 元素的内容:

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

aspnet_regiis -pef然后,您可以照常运行加密。运行后,只需取消注释该部分,您的站点就可以运行了。

于 2013-07-19T01:29:21.420 回答
4

这是一个彻底的黑客,但我不确定是否有另一种方法可以做到这一点,而无需强烈命名定义您的自定义部分的程序集并对其进行 GAC 化(尽管您提到这也不起作用,而且我不确定为什么它不会)。由于aspnet_regiis运行在<驱动器>:\Windows\Microsoft.Net\Framework\<版本>文件夹(在WinXP中),你可以将定义你的配置部分的DLL复制到相关的Framework\<版本>文件夹中,然后应该管用。

于 2009-04-24T17:21:40.463 回答
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();
}

注意事项:您的进程将需要对正在修改的配置文件的写入权限。您需要某种方式来授权谁可以运行它。保存时通常会重新启动网站。

于 2013-07-19T12:16:38.150 回答
2

显示为正确的答案是正确的。我想添加评论,但由于评论太长(示例配置条目)无法添加。

部分名称应使用程序集的全名。运行时程序集限定不适用于 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>
于 2012-01-23T20:04:00.840 回答