存储ASP.NET IIS7中子域组的会话cookie

时间:2011-01-06 05:16:48

标签: c# asp.net session cookies web-config

我有一个运行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的会话状态。

关于如何解决这个问题的任何想法?

3 个答案:

答案 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>

我希望我有所帮助,

乔恩