【发布时间】:2010-03-18 17:28:40
【问题描述】:
我有一个包含不同部分的应用程序。每个部分都通过一个域访问。示例:www.section1.com、www.section2.com、www.section3.com。当用户从一个 URL 导航到另一个 URL 时,我需要保留会话。该应用程序在 IIS 中是相同的。如何做到这一点?
【问题讨论】:
我有一个包含不同部分的应用程序。每个部分都通过一个域访问。示例:www.section1.com、www.section2.com、www.section3.com。当用户从一个 URL 导航到另一个 URL 时,我需要保留会话。该应用程序在 IIS 中是相同的。如何做到这一点?
【问题讨论】:
您需要传递会话cookie,并在新域上重新设置该cookie。这将使会话在多个域中进行(假设您使用相同的应用程序)。
例子:
来自 section1.com 的链接:
然后,OnSessionStart(或 OnRequestStart)检查查询参数并将会话附加到它。意思是,只需手动将 cookie ASP.NET_SESSIONID 设置为您传递的值。
这具有严重的安全隐患,因此除非您知道自己在做什么,否则不要允许这样做。另一种解决方案可能是将某些内容存储到一个公共后端(数据库?)并使用代表实际会话的令牌传递给用户(并基于该令牌设置 cookie),您在导航离开时在中间页面上生成从 section1.com -> transferusertonewdomain.aspx -> section2.com/?token=randomTokenThatMatchSessionInDatabase
这将防止任何人只要知道 cookie 的值就可以劫持会话。但是,如果您无论如何都对计算机有些熟悉,那么这种可能性永远不会降低。
【讨论】:
如果您有多个域(而不仅仅是更简单的子域),那么执行此操作的难度将超出您的预期,因为您无法在不同域之间共享 cookie。
通常的解决方法是在由 asp.net 页面(或 HttpHandler,如果您愿意)提供服务的其他域上嵌入图像链接。该页面应包含一个带有唯一令牌的查询字符串和该数据的散列版本,并附加一些共享机密。然后,该页面将在适合该域的响应上设置一个 cookie,以将其自身与适当的数据相关联。它通常会提供 1x1 透明图像作为响应。通常您只想在登录其中一个站点时执行此操作。
【讨论】:
除非您进行一些自定义,否则会话是特定于应用程序的,无论您使用何种会话模式。 Here's an article 讨论如何自定义 SQL 会话,以便您可以跨多个应用程序使用会话。
【讨论】:
您应该首先将 sessionState 从“InProc”更改为 StateServer 或 SqlServer,确保所有站点(域和服务器)的 MachineKey 相同,然后设置相关的后端系统以捕获状态信息。
更多信息请见:
【讨论】:
您可以使用 cookie 来传递它,但仍在研究以找出方法。我会转发的。
** 编辑
还有一个 Stack Overflow 问题,看看有没有帮助,315132
它基本上是问
我需要共享 SSO 信息 在两个不同的域之间 cookie,这可以在 PHP 中完成吗? 怎么样?
给出的答案是
在这两个域上,放置一个图像或 从中提取的其他 Web 元素 另一个域。使用网址 通知另一个域用户 X 是 在域 A 上,让域 B 将该用户 ID 与该用户相关联 在他们的系统上。
执行起来有点复杂 正确,但如果你想通了 效果会很好。
Vinko 在评论中指出 (谢谢!)我不应该接受它 假设您了解 涉及的安全风险。如果这 信息对任何人都具有任何价值, 那么你应该确保你使用 适当的加密、身份验证等 避免释放敏感 信息和避免各种 攻击(重播,中间人, ETC)。这不应该太繁重 因为你控制了这两个网站和 您可以为 两者,因为通信只是 通过这个在两台服务器之间进行 特殊网址。不过请记住。
用户是 Adam Davis。
【讨论】: