【问题标题】:One application, different domains: how to preserve sessions on ASP.NET?一个应用程序,不同的域:如何在 ASP.NET 上保留会话?
【发布时间】:2010-03-18 17:28:40
【问题描述】:

我有一个包含不同部分的应用程序。每个部分都通过一个域访问。示例:www.section1.com、www.section2.com、www.section3.com。当用户从一个 URL 导航到另一个 URL 时,我需要保留会话。该应用程序在 IIS 中是相同的。如何做到这一点?

【问题讨论】:

    标签: asp.net iis session


    【解决方案1】:

    您需要传递会话cookie,并在新域上重新设置该cookie。这将使会话在多个域中进行(假设您使用相同的应用程序)。

    例子:

    来自 section1.com 的链接:

    然后,OnSessionStart(或 OnRequestStart)检查查询参数并将会话附加到它。意思是,只需手动将 cookie ASP.NET_SESSIONID 设置为您传递的值。

    这具有严重的安全隐患,因此除非您知道自己在做什么,否则不要允许这样做。另一种解决方案可能是将某些内容存储到一个公共后端(数据库?)并使用代表实际会话的令牌传递给用户(并基于该令牌设置 cookie),您在导航离开时在中间页面上生成从 section1.com -> transferusertonewdomain.aspx -> section2.com/?token=randomTokenThatMatchSessionInDatabase

    这将防止任何人只要知道 cookie 的值就可以劫持会话。但是,如果您无论如何都对计算机有些熟悉,那么这种可能性永远不会降低。

    【讨论】:

      【解决方案2】:

      如果您有多个域(而不仅仅是更简单的子域),那么执行此操作的难度将超出您的预期,因为您无法在不同域之间共享 cookie。

      通常的解决方法是在由 asp.net 页面(或 HttpHandler,如果您愿意)提供服务的其他域上嵌入图像链接。该页面应包含一个带有唯一令牌的查询字符串和该数据的散列版本,并附加一些共享机密。然后,该页面将在适合该域的响应上设置一个 cookie,以将其自身与适当的数据相关联。它通常会提供 1x1 透明图像作为响应。通常您只想在登录其中一个站点时执行此操作。

      【讨论】:

        【解决方案3】:

        除非您进行一些自定义,否则会话是特定于应用程序的,无论您使用何种会话模式。 Here's an article 讨论如何自定义 SQL 会话,以便您可以跨多个应用程序使用会话。

        【讨论】:

          【解决方案4】:

          您应该首先将 sessionState 从“InProc”更改为 StateServer 或 SqlServer,确保所有站点(域和服务器)的 MachineKey 相同,然后设置相关的后端系统以捕获状态信息。

          更多信息请见:

          Session-State Modes

          ASP.NET State Management Overview

          【讨论】:

          • 这不会自动允许跨域的会话。这是一个浏览器问题,它不会尝试在域之间使用相同的会话。然而,在 stateserver 或 sqlserver 中使用会话允许在应用程序甚至多个 Web 服务器之间共享会话。然而,提问者使用的是相同的应用程序,所以 InProc 很好。
          【解决方案5】:

          您可以使用 cookie 来传递它,但仍在研究以找出方法。我会转发的。

          ** 编辑

          还有一个 Stack Overflow 问题,看看有没有帮助,315132

          它基本上是问

          我需要共享 SSO 信息 在两个不同的域之间 cookie,这可以在 PHP 中完成吗? 怎么样?

          给出的答案是

          在这两个域上,放置一个图像或 从中提取的其他 Web 元素 另一个域。使用网址 通知另一个域用户 X 是 在域 A 上,让域 B 将该用户 ID 与该用户相关联 在他们的系统上。

          执行起来有点复杂 正确,但如果你想通了 效果会很好。

          Vinko 在评论中指出 (谢谢!)我不应该接受它 假设您了解 涉及的安全风险。如果这 信息对任何人都具有任何价值, 那么你应该确保你使用 适当的加密、身份验证等 避免释放敏感 信息和避免各种 攻击(重播,中间人, ETC)。这不应该太繁重 因为你控制了这两个网站和 您可以为 两者,因为通信只是 通过这个在两台服务器之间进行 特殊网址。不过请记住。

          用户是 Adam Davis。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-03
            • 2018-03-20
            • 2016-12-26
            • 2010-10-08
            • 2013-06-04
            • 2017-11-22
            • 2011-03-01
            • 2018-09-08
            相关资源
            最近更新 更多