【问题标题】:Why would a cookie that is visible in a request in Fiddler not be available in the Request.Cookies collection?为什么在 Fiddler 的请求中可见的 cookie 在 Request.Cookies 集合中不可用?
【发布时间】:2015-02-18 01:05:32
【问题描述】:

我正在使用相同域但不同子域的 .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 是否没有添加到 Request.Cookies 集合中,因为它不是有效的身份验证 cookie?如果是,为什么它无效?

总结一下,当我在请求的页面上执行以下操作时:

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

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

【问题讨论】:

    标签: asp.net .net-4.0 .net-2.0 forms-authentication single-sign-on


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      还有这个: Forms Authentication SSO - Why does User.Identity.IsAuthenticated == false

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

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

      <httpRuntime targetFramework="4.0" />
      

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我在日志文件中添加了 cookie,它们确实被通过了,所以我猜它不是负载均衡器。这似乎不太可能。尝试Request.Cookies[".SSOAUTH"] 确实很傻,但我见过奇怪的事情发生,所以我还是尝试了,但我得到了相同的结果。我已经检查了计数,甚至循环显示所有名称和值。 .SSOAUTH cookie 根本不存在。我猜这个值有问题,它不允许将它添加到集合中。感谢您帮助我消除了一种可能性。
        猜你喜欢
        • 2013-09-16
        • 2017-02-01
        • 2013-03-27
        • 2012-04-21
        • 2018-04-09
        • 2011-09-29
        • 2011-03-21
        • 1970-01-01
        • 2012-11-24
        相关资源
        最近更新 更多