22

情况如下:

我正在尝试在网站之间共享一个 cookie(表单身份验证)。

我本身没有使用表单身份验证。我正在使用内置方法(加密、解密等),但我正在设置自己的自定义 cookie。

当我在其中一个网站上设置 cookie 时,其他网站会看到 cookie,但无法解密。该错误是通用的“密码操作期间发生错误”。

我所保证的:

  1. cookie 将域设置为“example.com”(这意味着子域可以访问。证明是其他网站可以“看到”cookie)。
  2. 两个网站共享相同的机器密钥。两者的 web.config 具有相同的解密密钥和验证密钥值。
  3. 两个网站的表单身份验证票证版本和 cookie 名称相同。
  4. 路径设置为“/”。

我以前做过这个,它工作正常,但在那种情况下,两个应用程序共享相同的代码库。

在这种情况下,它们是单独的应用程序。这是因为我正在设计一个解决方案原型,其中同一顶级域上的两个独立于平台的应用程序可以共享一个身份验证 cookie。

谁能告诉我我缺少什么,或提供替代解决方案。

我已经阅读了所有相关问题,但答案通常是上面的 2)。

4

2 回答 2

40

当您创建一个新的 ASP.NET 4.5(例如 ASP.NET MVC 4)应用程序时,将以下行添加到 web.config:

<httpRuntime targetFramework="4.5" />

这在我的其他应用程序中不存在,可能是因为我的其他应用程序是升级到 4.5 的 ASP.NET 3.5 应用程序。

在新的 ASP.NET Web 应用程序中删除该行解决了该问题。

我认为这是由于兼容性模式值:http: //msdn.microsoft.com/en-us/library/system.web.configuration.machinekeysection.compatibilitymode.aspx

框架 45。ASP.NET 4.5 的加密增强功能已生效。如果应用程序 Web.config 文件将 httpRuntime 元素的 targetFramework 属性设置为“4.5”,则这是默认值。

不知道我知道删除那条线是如何解决问题的。我假设应用程序一具有不同的兼容性模式,因为它没有那个httpRuntime元素。

于 2013-02-18T01:00:58.177 回答
15

处理此问题的最佳方法是使机器密钥解密回退到 Framework20SP2

从这篇文章:http: //msdn.microsoft.com/en-us/library/system.web.configuration.machinekeysection.compatibilitymode.aspx

只需将该属性添加到您的 .net 4.5 应用程序中的 machinekey

<machineKey validationKey="" decryptionKey="" validation="SHA1" compatibilityMode="Framework20SP2" />

您现在不需要从 httpruntime 中删除 targetFramework="4.5" 。

于 2014-01-13T09:40:44.007 回答