我使用.net MachineKey.Protect
方法加密一个应用程序中的标记,并使用相应的MachineKey.Unprotect
方法验证另一个应用程序中的标记。
一切正常,直到我必须在IIS中将启用32位应用程序设置为 True 才能运行其他代码。然后MachineKey.Unprotect
方法抛出异常
加密操作期间发生错误。
我在同一个应用程序池中的两个应用程序,以及不同的应用程序池和设置的所有组合中尝试了这个。除了启用32位应用程序在所有实例中设置为 False 之外的任何内容都会导致错误。
关于可能导致此问题的任何想法?
答案 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 指定不同的值,这可能会导致问题,直到并包括密钥的差异,或者生成默认密钥。