如何在ASP.NET中跨多个子域共享会话?

17

我有一个应用程序,在使用过程中,用户可能会从中单击

virginia.usa.com
newyork.usa.com

我不想每次用户在不同的子域之间切换时都创建一个新会话,有什么好的方法可以在多个子域之间共享会话信息?

5个回答

41

你给这个问题打了ASP.NET和IIS的标签,所以我会认为这是你的环境。确保在你的web.config文件中有以下配置:

<httpCookies domain=".usa.com"/>
如果您的2个子域名映射到同一个应用程序,则已完成。但是,如果它们是不同的应用程序,则需要进行一些额外的工作,比如使用基于SQL Server的会话存储(并修改存储过程以确保所有应用程序共享相同的会话数据),或使用HttpModule拦截应用程序名称,因为即使使用共享的Cookie和相同的机器密钥,2个应用程序仍将使用2个不同的存储来存储其会话数据。

非常感谢Matt! 我们之前使用过 这个解决方案,但它一直阻止OutputCaching的正常工作。你的解决方案让我们的OutputCache终于能够工作了 :-D - Oliver
2
我在本地主机上尝试了这个(使用我的hosts文件中的子域名),但它不起作用。我可以很好地拉起子域名,但是从一个到另一个会导致会话丢失并且用户必须重新登录。有什么想法吗? - Marc
我认为这个链接提供了一个很好的解决方案:http://support.microsoft.com/kb/2527105(如何在子域之间共享会话状态),来自微软支持。它依赖于HTTP模块,因此您不必更新现成的会话SQL数据库。 - Tarek El-Mallah
web.config 域名是 virginia.usa.com 还是 newyork.usa.com?请帮忙。 - HOÀNG LONG

3
我最近经历了这个问题,也学习了艰辛的方法。Localhost实际上被认为是一个TLD。Cookie域名要求至少有二级域名 - test.com。如果您希望所有子域名都能使用cookies,请在前面加上'.' - .test.com。
当本地运行/调试时,将域名设置为localhost会失败,即使正确设置域名也会失败,因为Visual Studio默认使用localhost。
可以在项目属性中更改此默认localhost,以便项目实际上在cookie域test.com上运行。如果浏览器中的地址匹配,则可以使其正常工作。
我的问题在这里记录下来:Setting ServiceStack Cookie Domain in Web.Config Causes Session Id to Change on Every Request 希望这可以帮到您。

3

跟踪您自己的会话,并使用适当的域设置cookie,例如.usa.com

另外,如果您使用PHP,则我认为有一种设置可以更改它使用的会话cookie的默认域设置,这也可能很有用。

您需要查找的设置如下:

session.use_cookies = 1
session.use_only_cookies = 1
session.cookie_domain = .usa.com

0

如果您有多个子域指向同一个IIS应用程序(这正是我现在所处的情况,使用通配符DNS,然后在接收端进行子域“嗅探”),那么Matt的答案绝对是正确的选择。

然而,我想补充一些我经历过的事情,以防有人发现这对他们不起作用。仅设置httpCookies行并不能解决我的问题,我必须在web.config文件中添加machineKey条目:

machineKey decryptionKey="12...D1" validationKey="D7..8B"

特别奇怪的是,我并没有处于Web Farm设置中(除非AWS/EC2有效地充当此类设置)。一旦我这样做了,它就像一个冠军一样工作。


0
如果您正在使用PHP,一个小技巧是创建一个包含脚本(或两个)来执行以下操作: 1.将$_SESSION数组序列化 2.将该字符串作为隐藏输入传递,并使用POST在单独的表单中制作所有链接到这些按钮。 3.还包括一个布尔隐藏输入,以让脚本知道它是否需要使用当前会话或unserialize $_POST['session']。 4.在适当的地方调用它,将其部署在整个站点上。
如果实际上有一种被认可的传输会话的方法,我不会这样做。我希望您至少考虑使用cookie。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接