2

我正在使用相同域但不同子域的 .NET 2.0 站点和 .NET 4.0 站点之间进行 SSO。在单台机器上的开发环境中一切正常,但我无法让 4.0 生产站点接受 2.0 生产站点生成的身份验证 cookie。这两个站点位于不同的服务器上,一个运行仅安装了 2.0 框架的 IIS 6,另一个运行安装了 4.0 框架的 IIS 7.5。我已经阅读了其他问题的所有其他答案,这些问题指出了<machineKey>元素和元素的问题<authentication><forms>,相信我,所有这些东西都已正确设置,并且所有 4 个站点对这些元素具有完全相同的属性值。

起初我认为这是加密的问题,但是当我仔细查看 Fiddler 发生的事情时,我发现 auth cookie 已在请求中正确传递,但似乎在某个时候消失了,然后就没有了在 Request.Cookies 集合中可用。

4.0 生产站点位于负载均衡器后面,但目前网络场中没有其他在线服务器。负载均衡器会以某种方式丢弃 cookie 吗?cookie 是否因为不是有效的身份验证 cookie 而未添加到 Request.Cookies 集合中?如果是这样,为什么它无效?

总而言之,当我在请求的页面上执行以下操作时:

HttpCookie AuthCookie = Request.Cookies.Get(".SSOAUTH");

AuthCookie 为空,即使我可以在 Fiddler 的请求标头中看到具有该名称的 cookie。

4

3 回答 3

5

由于每台服务器上的加密算法不同,身份验证票证可能无效。当某些 MS 安全更新应用于一台服务器但未应用于另一台服务器时,可能会发生这种情况。如果 cookie 不包含有效值,它将不会被添加到Request.Cookies集合中,即使它是在请求中传递的。

于 2012-07-16T21:26:22.990 回答
2

我只是想添加另一个选项来说明可能导致这种情况的原因。我花了将近 2 天的时间尝试在 .NET 4.0 WebForms 应用程序和 .NET 4.5 MVC 应用程序之间实现单点登录问题。
和你一样,我确信我已经正确配置了machineKeyandauthentication元素。但我看到浏览器正在发送表单身份验证 Cookie,但在我的 4.5 应用程序的 Request.Cookies 中不可见。

然后我发现了这个: http ://www.shawnmeyer.com/2013/10/sharing-forms-authentication-tickets-between-applications/

这: 表单身份验证 SSO - 为什么 User.Identity.IsAuthenticated == false

这给出了解决 FormsAuthentication Cookie 验证失败的两种不同方法。

基本上,您必须确保httpRuntimes 都针对相同版本的框架,或者您必须将 a 添加compatibilityModemachineKey较新的 Web 应用程序中。无论哪种方式都对我有用 - 在 4.5 应用程序中,更改以下之一:

<httpRuntime targetFramework="4.0" />

或者

<machineKey validationKey="..."
                decryptionKey="..."
                validation="SHA1" decryption="AES" compatibilityMode="Framework20SP2"/>
于 2015-02-17T17:05:32.947 回答
0

您可以尝试将 cookie 添加到 IIS 中的日志记录,以检查它是否通过负载平衡器。

另外,我知道很傻,但是您是否尝试过 Request.Cookies[".SSOAUTH"] 。还要查看 .count 以查看它收到了多少 cookie。

于 2012-05-21T17:56:29.587 回答