我有一个运行ASP.NET的应用程序。我有不同的域和不同的子域。我希望域名与子域名分享会话。
例如,以下域访问此应用程序:
www.example1.com
print.example1.com
www.example2.com
print.example2.com
如果用户访问www.example1.com和print.example1.com,我希望它使用相同的会话。如果用户要访问www.example2.com和print.example2.com,我希望它使用与* .example1.com不同的会话。
我以前处理它的方式是在page_load中的hack在IIS6中完美运行:
Response.Cookies [“ASP.NET_SessionId”]。Value = Session.SessionID;
Response.Cookies [“ASP.NET_SessionId”]。Domain = SiteUtility.GetCookieDomain();
(SiteUtility.GetCookieDomain将返回.example1.com或.example2.com,具体取决于请求的网址)
不幸的是,这似乎不再适用于iis7。用户访问的每个子域/域,用户都会获得一个新的会话cookie。
然后我找到了web.config条目:
'< httpCookies domain =“。example1.com”/>。
这适用于在example1.com子域之间共享会话cookie。不幸的是,这完全搞砸了* .example2.com的会话状态。
关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
您是否尝试创建拦截HttpModule
- 事件的EndRequest
,对Response.Cookies
集合进行迭代,找到session-cooke并在实际更改其Domain
属性之前发送给客户。
修改强>
凯文最后确定其中一个子域在ie8中处于受信任状态而另一个不在。当两者都处于受信任状态(并且两者都处于不受信任的状态)时,它就可以工作。我确实花了最多的时间在这上面,所以凯文想给我答案。
答案 1 :(得分:0)
而不是使用SiteUtility.GetCookieDomain(),请尝试使用:
var domainSansTLD = Request.Url.Host.Replace(".com", "");
var secondLevelDomain = domainSansTLD.Substring(domainSansTLD.LastIndexOf('.'));
var cookieDomain = secondLevelDomain + ".com";
答案 2 :(得分:0)
第一种方式,
将会话存储为两个服务器都可以访问的位置(这适用于虚拟服务器或共享文件夹)。这种方法有点不可靠,共享文件夹和滞后因此导致问题。
好吧,我打算写几个其他的方法,但我确信它们会被发布,因为他们对asp.net的了解比我更多,但是,我确实有个人喜好,我认为会是一个不错的选择。
此选项将是一个memcache服务器。从本质上讲,它是一个运行RAM的数据库,你将所有会话都指向它(tcp://mem.domain.com:1234 ...对不起,我不记得我头顶的通常端口了。) / p>
我希望我有所帮助,
乔恩