我有一个应用程序,在使用过程中,用户可能会从中单击
virginia.usa.com
newyork.usa.com
我不想每次用户在不同的子域之间切换时都创建一个新会话,有什么好的方法可以在多个子域之间共享会话信息?
你给这个问题打了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
如果您有多个子域指向同一个IIS应用程序(这正是我现在所处的情况,使用通配符DNS,然后在接收端进行子域“嗅探”),那么Matt的答案绝对是正确的选择。
然而,我想补充一些我经历过的事情,以防有人发现这对他们不起作用。仅设置httpCookies行并不能解决我的问题,我必须在web.config文件中添加machineKey条目:
machineKey decryptionKey="12...D1" validationKey="D7..8B"
特别奇怪的是,我并没有处于Web Farm设置中(除非AWS/EC2有效地充当此类设置)。一旦我这样做了,它就像一个冠军一样工作。