-1

我有一个具有这样结构的 ASP.NET 系统,在同一台服务器上托管 .Net 1.1 和 .Net 2.0 应用程序:

/apps11/app1
/apps11/app2
/apps11/web.config
/apps20/app3
/apps20/app4
/apps20/web.config

上面这两个 web.config 文件具有特定于其 .Net 版本的部分,但与表单身份验证和机器密钥相关的部分是相同的(因此表单身份验证 cookie 可以在不同版本的应用程序之间共享)。该部分如下所示(混淆了真实密钥,但保留了确切的长度和设置):

<machineKey
   validationKey="AAAABBBBCCCCDDDDEEEEFFFF0000111122223333"
   decryptionKey="BBBB9999AAAA1111"
   validation="SHA1">
</machineKey>
<authentication mode="Forms">
  <forms name=".ASPXAUTH" protection="All" timeout="15" path="/" loginUrl="/apps20/login.aspx"></forms>
</authentication>

应用登录页面组件升级后,1.1 应用的共享身​​份验证停止工作。我可以登录到 2.0 应用程序,但是当我导航到 1.1 应用程序时,它会不断地将我重定向回登录页面。经历了以下故障排除步骤:

  1. MS10-070 存在问题并需要KB243375 补丁?它已经在服务器上应用了。
  2. 安装程序破坏了机器密钥?我检查了 machinekey 值,安装程序更新了 validationKey 和 encryptionKey 值。但是,设置保持不变(validation="SHA1"),并且两个 web.config 文件中的机器密钥相同。
  3. machine.config 或 web.config 中每个 .Net Framework 版本的其他值?在 .Net 2.0 web.config 中找到了域设置,但这似乎只影响票证 cookie 的域,而不影响它的内容。
  4. 如何在 ASP.NET V1.1 和 ASP.NET V2.0 应用程序之间共享身份验证 Cookie中所述,1.1 和 2.0 之间的加密设置存在问题?除了键值之外什么都没有改变,为什么它现在会坏掉呢?
4

1 回答 1

2

回答我自己的问题。在 .Net 1.1 之后的许多年里,我怀疑很多其他人会需要这些信息,但把它放在这里以防万一......

最后,问题确实是上面的#4。不仅键发生了变化,而且键的长度也发生了变化:

<machineKey
  validationKey="EEEEEEEE77778888999900001111AAAABBBBCCCCDDDDFFFFAAAABBBBCCCCDDDDEEEEFFFF1111222233334444555566667777888899990000AAAABBBBCCCCDDDD"
  decryptionKey="888899990000111122223333444455556666777788889999" validation="SHA1">
</machineKey>

线索出现在这篇Security via in ASP.NET 2.0文章中,它说“解密属性是 ASP.NET 2.0 中的新增功能,以减少旧版本验证属性的重载。此属性的自动选项使用从密钥大小推断的算法。默认为三重 DES 加密,但 128 或 256 位的密钥将使用 AES。

在 .Net 2.0 web.config 中将encryption="3DES"添加到我的 machineKey 标记解决了这个问题。它工作了多年,因为旧密钥足够短,可以推断出 3DES。新密钥足够长,可以推断出 AES。

我回去阅读了 machineKey element 的 MSDN 文档。它只是说“ASP.NET 根据配置设置确定要使用的解密算法”。虽然稍后在本主题中它会告诉您每种加密类型使用的密钥长度,但它并没有说加密类型是从长度推断出来的。事实上,它告诉您如何使用比推荐长度更短的密钥(不确定您为什么要这样做)。

有什么更好的解决方案吗?我是唯一一个认为 MSDN 文档在这一点上有些欠缺的人吗?

于 2012-09-04T18:00:14.650 回答