启用32位应用程序时,MachineKey.Protect / Unprotect会中断

时间:2016-04-15 10:10:15

标签: c# asp.net iis

我使用.net MachineKey.Protect方法加密一个应用程序中的标记,并使用相应的MachineKey.Unprotect方法验证另一个应用程序中的标记。

一切正常,直到我必须在IIS中将启用32位应用程序设置为 True 才能运行其他代码。然后MachineKey.Unprotect方法抛出异常

  

加密操作期间发生错误。

我在同一个应用程序池中的两个应用程序,以及不同的应用程序池和设置的所有组合中尝试了这个。除了启用32位应用程序在所有实例中设置为 False 之外的任何内容都会导致错误。

关于可能导致此问题的任何想法?

3 个答案:

答案 0 :(得分:1)

我的问题的答案是在 machine.config

的两个版本中指定固定的机器密钥
  

C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ machine.config

  

C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \配置\ machine.config中

<div class="section group"> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> <div class="col span_1_of_9"> 1 of 9 </div> </div>

中添加此元素
.span_1_of_12 {
	width: 22.6%;
	margin: 1% 0 1% 3.2%;
}

我仍然不确定为什么会这样。 IIS设置为在IIS管理器中使用服务器范围的计算机密钥。当我试图搜索machine.config文件中的现有密钥时,解决问题的线索出现了。

您仍然需要确保两个应用程序都以相同的模式运行。

您可以在运行启用32位应用程序 True 解密的应用程序中加密在另一个启用32位应用程序设置为错误的情况下,如果您在应用程序中设置机器密钥&#39;的web.config

修改

自从尝试将其部署到运行Server 2008的服务器后,我们发现有必要修改4个machine.config文件:

  

C:\的Windows \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG \ machine.config中   C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ CONFIG \ machine.config中   C:\ WINDOWS \ Microsoft.NET \ Framework64 \ V2.0.50727 \ CONFIG \ machine.config中   C:\的Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \配置\ machine.config中

仍然不知道为什么

答案 1 :(得分:0)

我实际上并不确定,但Enable 32bit applications会改变工作流程的位置。

在32位系统上它什么都不做。

在x64系统上,当它设置为false(默认值)时,IIS工作进程在x64模式下工作并使用64位环境(路径,注册表等)。但是当此设置设置为true时,相关的工作进程将以x86模式启动,并且使用32位(syswow)环境 - 设置,可执行文件,com组件等 - 可能会消失或者可能会显示不同的版本。这是因为syswow environament使用不同的系统路径,不同的注册表位置等。

我不会惊讶地发现为普通和syswow环境存储的加密密钥是不同的。无论您使用什么进行加密,请尝试在32位模式下启动并重试。

另外,Error occurred during a cryptographic operation.并没有多说,真的。你有没有检查过堆栈跟踪还是不感兴趣?

答案 2 :(得分:0)

从 32 位切换到 64 位应用程序将导致加载不同的 machine.config,如果 machine.config 为 machinekey 指定不同的值,这可能会导致问题,直到并包括密钥的差异,或者生成默认密钥。