为什么加密Web.config文件而不提供keyContainerName?

时间:2011-02-08 15:19:09

标签: .net asp.net web-config web-config-encryption

因此,使用aspnet_regiis.exe实用程序,我已完成以下操作

//Create the container
aspnet_regiis -pc MyRSAKey -exp

//Write key to file
aspnet_regiis -px MyRSAKey MyRSAKey.xml

//Install the key into a machine-level RSA key provider.
aspnet_regiis -pi MyRSAKey MyRSAKey.xml

//Grant access to the contrainer
aspnet_regiis -pa "MyRSAKey" "NT Authority\Network service"

现在我认为要使用此密钥,我需要将其添加到web.config文件

<configProtectedData defaultProvider="MyProviderName">
<providers>
  <add
    name="MyProviderName" 
    type="System.Configuration.RsaProtectedConfigurationProvider,  System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"           
    keyContainerName="MyRSAKey"
    useMachineContainer="true" />
</providers>

现在,当我运行此命令时,它可以工作:

aspnet_regiis -pef "sectiomName" "pathToConfigFile" -prov "MyProviderName"

无论我对keyContainerName有什么价值,它都有效。或者甚至当我从配置文件中完全取出keyContainerName时,它仍然有效,表明它实际上并没有使用我生成和安装的密钥。

Visual Studio 2010甚至不识别keyContainerName(或useMachineContainer),说不允许使用'keyContainerName'名称。

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

要解决这两个问题:

  

Visual Studio 2010甚至不识别keyContainerName(或useMachineContainer)表示不允许使用'keyContainerName'名称。

     

这里发生了什么?

我没有反编译相关的配置节类进行检查,但我发现RsaProtectedConfigurationProvider具有属性KeyContainerNameUseMachineContainer,所以它似乎是a)在解析时providers/add元素使用反射在type的实例上设置相应的字段; b)编写VS2010用于验证.config文件的XML模式的人忘记了<xsd:anyAttribute>标记。

(FWIW这个问题是我在发现你的问题时我希望回答的问题,这个问题在谷歌的keycontainername attribute is not allowed中排名很高。)


  

无论我对keyContainerName有什么价值,它都有效。或者甚至当我从配置文件中完全取出keyContainerName时,它仍然有效,表明它实际上并没有使用我生成和安装的密钥。

当你说“它有效”时,我认为你的意思是aspnet_regiis -pef不会出错。但是,如果您尝试访问代码中受保护的配置部分,我打赌它会抱怨,除非您使用了正确的keyContainerName

我怀疑如果名称与已知密钥容器不对应,则会创建一个新容器,但我没有尝试验证这一点。