我怎样才能在ASP.NET中的多个子域共享一个会话?

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

virginia.usa.com 

 newyork.usa.com 

由于我宁愿不创build一个新的会话,每次用户从一个子域跨越到另一个,有什么好办法跨多个子域共享会话信息?

你用ASP.NET和IIS标记了这个,所以我会认为这是你的环境。 确保你的web.config中有这个:

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

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

跟踪你自己的会话,并使用一个适当的域名设置的cookie,即。 .usa.com

另外,如果你使用PHP,我相信有一个设置可以改变它使用的会话cookie的默认域设置,这也许是有用的。

您正在寻找的设置是:

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

我最近通过这个,并学习了艰难的方式。 本地主机实际上被认为是一个顶级域名。 Cookie域至less需要二级域名 – test.com。 如果你想让cookies工作于一个域名及其所有的子域名,用“。”作为前缀。 – .test.com。

在本地运行/debugging时,设置localhost域将会失败,即使域设置正确,也会失败,因为visual studio默认使用localhost。

可以在项目属性中更改此默认的本地主机,以便项目实际上在cookie域test.com上运行。 实质上,如果浏览器中的地址匹配,则可以使其工作。

我的问题logging在这里: 在Web.Config中设置ServiceStack Cookie域导致会话ID在每个请求上更改

希望这可以帮助。

如果你使用的是PHP,那么一个小技巧就是做一些脚本(或者两个)来完成下面的工作:

1序列化$ _SESSION数组2将该string作为隐藏input传递,使用POST将所有到这些button的链接以单独的forms显示出来。 3还包括一个布尔隐藏的input,让您的脚本知道是否需要使用当前会话或反序列化$ _POST ['会话'] 4在您的网站部署此,在适当的地方

如果实际上有一个被批准的方式转移会话,我不会这样做。 我希望你至less已经考虑过使用cookies。

我不认为不同的子域本身会强制不同的会话。 您提供的两个URL都可以指向IIS中的相同应用程序。

这听起来像是你有不同的服务器或至lessIIS中的每个子域不同的网站。 存储这种持久状态的最好方法是在一个中央数据库中。 我发现ASP.NET中的Profile服务对于这个目的非常有用。

希望有所帮助。

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

但是,我想添加一些我曾经遇到过的情况,以防有人发现这不适合他们。 单独设置httpCookies行没有为我做,我不得不添加一个machineKey条目到我的web.config文件:

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

特别奇怪,因为我不是在网上农场设置(除非AWS / EC2是有效地这样做)..只要我这样做,它就像一个冠军。