原文:http://caomao.cnblogs.com/archive/2005/07/05/186606.html

今天一早看了dudu关于二级域名Cookie的问题及解决方法,认为dudu的原理解释不是十分明确,不能确定dudu的代码
FormsAuthentication.SetAuthCookie后添加下属代码
HttpCookie cookie = Request.Cookies[".DottextCookie"];
if(cookie!=null)
{
cookie.Domain = ".cnblogs.com";
Response.Cookies.Add(cookie);
} ”是否是笔误。
因为在FormsAuthentication.SetAuthCookie之后,cookie只是被加入了Response的cookies队列中而已,我想正确的代码应该如下:
  //the following code block  equal to "FormsAuthentication.RedirectFromLoginPage + change cookie domain "
   FormsAuthentication.SetAuthCookie(txtName.Text,false);
   HttpCookie lcookie 
= Context.Response.Cookies[FormsAuthentication.FormsCookieName];
   lcookie.Domain 
= ".cnblogs.com";//
   Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text,false));


共享用户登录状态的原理解释如下:

Asp.net中的Forms验证方式,在服务端通过用户验证的代码一般如下:
FormsAuthentication.RedirectFromLoginPage("UserName", false);//该代码写一个加密的Cookie.该Cookie存储UserName等加密信息。但是在Asp.net中,该Cookie的Domain值是为空,表示以游览器默认的页面请求路径的Domain值作为cookie的domain存储。如果浏览器以www.cnblogs.com/login.aspx 登录,那么该浏览器存储cookie的时,该cookie的domain为www.cnblogs.com。这样如果浏览器请求页面 http://caomao.cnblogs.com/admin/EditPosts.aspx,此时,浏览器不会把刚才存储的cookie值作为Request的Cookie向服务器发送。因为caomao.cnblogs.com和www.cnblogs.com是完全不同的主域名。

cookie的domain属性就是为了让浏览器根据页面请求路径的domain值,获取匹配的cookie,并把这些cookie发送给服务器。而匹配的方式有两种:
1、主Domain完全相同. 比如 页面请求路径的Domain一直是www.cnblogs.com。而domain为“caomao.cnblogs.com”的cookie是不匹配的
2、SubDomain相同, 比如,如果在caomao.cnblogs.com/上写的cookie指定了该cookie的domain为"cnblogs.com",那么在浏览器请求www.cnblogs.com时,该cookie被匹配,即该cookie也会被发送给www.cnblogs.com服务器端。

为了在www.cnblogs.com的也能读取在caomao.cnblogs.com上存储的用户已经登录的cookie信息,必须让该cookie的domain设置为"cnblogs.com"。但是正如上面所述,Asp.net的FormsAuthentication.RedirectFromLoginPage("UserName", false);记录用户登录的cookie的domain为空。所以我们不能用FormsAuthentication.RedirectFromLoginPage("UserName", false);方式,而必须以下面的代码代替:
  //the following code block  equal to "FormsAuthentication.RedirectFromLoginPage + change cookie domain "
   FormsAuthentication.SetAuthCookie(txtName.Text,false);
   HttpCookie lcookie 
= Context.Response.Cookies[FormsAuthentication.FormsCookieName];
   lcookie.Domain 
= ".cnblogs.com";//
   Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text,false));
经过该代码处理的Forms验证登录的User,再去访问www.cnblogs.com时,就能共享该已登录信息。同样的,如果在www.cnblogs.com登录时也用上述代码,在caomao.cnblogs.com时,也能共享该已登录信息。

关于用户的注销处理也需要做类似的改动,具体代码如下:
//set the  cookie to expired
            FormsAuthentication.SignOut();    
            
//get the expired cookie
            HttpCookie  lcookie2 = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
            
//set the cookie Domain 
            lcookie2.Domain = ".cnblogs.com";

说到这里,不知道大家是否已经清楚?由于表达能力所限,敬请谅解。附上具体实例代码,供参考:/Files/caomao/SecondDomain.rar
在本机仿真两个同SubDomain的环境,可以在本机的操作系统安装路径下的host文件中添加两个host:我添加了:(第一作为主域,第二个作为二级域)
127.0.0.1 http://www.zendyhu.com/ 
127.0.0.1 Second.zendyhu.com
posted on 2009-03-09 00:14  钱途无梁  阅读(687)  评论(0编辑  收藏  举报