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

时间:2008-11-07 21:41:38

标签: asp.net iis session

我有一个应用程序,在使用该应用程序的过程中,用户可能会点击

virginia.usa.com

newyork.usa.com

由于每次用户从一个子域跨越到另一个子域时我不想创建新会话,在多个子域之间共享会话信息的好方法是什么?

5 个答案:

答案 0 :(得分:37)

您使用ASP.NET和IIS对此进行了标记,因此我认为这是您的环境。确保在web.config中有这个:

<httpCookies domain=".usa.com"/>

如果您的2个子域名映射到同一个应用程序,那么您就完成了。但是,如果它们是不同的应用程序,则需要执行一些额外的工作,例如使用基于SQL Server的会话存储(以及黑客存储过程以确保所有应用程序共享相同的会话数据)或使用HttpModule拦截应用程序名称因为即使使用共享cookie和相同的机器密钥,2个应用程序仍将使用2个不同的存储来存储其会话数据。

答案 1 :(得分:3)

跟踪您自己的会话并使用具有适当域设置的Cookie,即。 .usa.com

或者,如果您使用的是PHP,我相信有一个设置可以更改它使用的会话cookie的默认域设置,这也可能很有用。

您正在寻找的设置是:

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

答案 2 :(得分:3)

我最近通过这个并且学到了很难的方法。 Localhost实际上被认为是TLD。 Cookie域至少需要二级域名 - test.com。如果您希望cookie适用于域及其所有子域,请使用“。”作为前缀。 - .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 :(得分:0)

如果您正在使用PHP,那么一个hack就是制作一些包含脚本(或两个)来执行以下操作:

1序列化$ _SESSION数组   2将该字符串作为隐藏输入传递,使用POST以单独的形式创建所有指向这些按钮的链接。   3还包括一个布尔隐藏输入,让您的脚本知道它是否需要使用当前会话或反序列化$ _POST ['session']   4在您的网站上部署此内容,在适当的地方调用

如果实际上有一种制裁方式来转移会话,我不会这样做。我希望你至少考虑过使用cookies。

答案 4 :(得分:0)

如果您有多个子域指向同一个IIS应用程序(这正是我现在的情况,使用通配符DNS,然后在接收端进行子域'嗅探'),马特的答案肯定是要走的路。 / p>

然而,我想添加一些我经历过的东西,以防有人发现这对他们不起作用。单独设置httpCookies行并没有为我做,我必须在我的web.config文件中添加machineKey条目:

machineKey decryptionKey =“12 ... D1”validationKey =“D7..8B”

特别奇怪,因为我在网络服务器场设置中(除非AWS / EC2实际上是这样做的)。一旦我这样做,它就像一个冠军。