用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
libiyang的公告
<center> <script src="http://www.NewZGC.com/others/counter/counter.asp?username=libiyang&style=0"></script> </center> <center><strong><font color=blue> <br> 时钟日历: </font></strong><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="150" height="150" align="middle"> <param name="movie" value="http://bbs.smgbb.cn/Skins/Default/clock.swf"> <param name="quality" value="high"> <param name="WMODE" value="transparent"> <embed src="http://bbs.smgbb.cn/Skins/Default/clock.swf" width="150" height="150" align="middle" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" scale="noborder" bgcolor="#E4E8EF"></embed> </object></center> <hr> <p align=center><strong><font color=blue>今明天气:</font></strong></br> <iframe width=167 height=240 frameborder=0 scrolling=NO src="http://appnews.qq.com/cgi- bin/news_qq_search?city=%B9%E3%D6%DD" style="border:1 dashed #999999"></iframe> </p> <hr>
文章分类
友情链接
21世纪asp.net技术网
SQL Server杂志
周奕(共享软件)
孟子E章
小虫的窝
李洪波的Blog
水晶报表方面的
存档

原创  在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态 收藏

今天一早看了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 www.zendyhu.com 
127.0.0.1 Second.zendyhu.com

发表于 @ 2005年08月30日 23:37:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:单一登陆(Single Sign-on)问题  | 新一篇:用CodeSmith生成数据库实体类的代码.

  • 发表评论
  • 评论内容:
  •  
Copyright © libiyang
Powered by CSDN Blog