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

转载 2007年10月15日 10:49:00

 原文地址: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队列中而已,我想正确的代码应该如下:

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

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));


  //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

Android开发高级组件与框架——ShareSDK

-
  • 1970年01月01日 08:00

实现多个站点(SubDomain相同)共享同一用户登录状态

在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态        原文地址:http://caomao.cnblogs.com/archive/2005/07/05/1...
  • poplau
  • poplau
  • 2008-04-23 13:09:00
  • 1482

ASP.NET 2.0 二级域名Forms验证模式下共享登陆状态

http://www.cnblogs.com/jzywh/archive/2007/09/23/902905.html 
  • jzywh
  • jzywh
  • 2008-04-21 12:55:00
  • 577

多个子站点共用同一个Cookies验证

公司的网站最近新增加一栏目---互动社区站点域名为http://club.xxx.com用户验证全站使用Cookies,由于以前没有涉及到过这种多站点同时验证,最初就是到网上搜索多个子站点共用Cook...
  • jxufewbt
  • jxufewbt
  • 2007-07-02 16:59:00
  • 1262

.net 多个子域名共享Form登陆认证

一、首先需要在web.config中配置Form认证方式               二、需要设置成相同的machineKey ...
  • fireicesion
  • fireicesion
  • 2015-03-05 15:03:33
  • 393

同一域名不同站点共享forms验证

                        forms name=".ASPXAUTH"                    loginUrl="logon.aspx"             ...
  • ytzz
  • ytzz
  • 2006-12-26 16:59:00
  • 552

实现多域名下共用一个SESSION

多域名共用一个SESSION,这是很多人都梦想的事情。各位多域名站长要仔细看了.....
  • lbuskeep
  • lbuskeep
  • 2011-01-24 00:37:00
  • 13605

同一服务器不同域名session共享

Tomcat下,不同的二级域名之间或根域与子域之间,Session默认是不共享的,因为Cookie名称为JSESSIONID的Cookie根域是默认是没设置 的,访问不同的二级域名,其Cookie就重...
  • MrCharles
  • MrCharles
  • 2016-01-02 09:24:30
  • 4074

主站和虚拟目录之间的Forms身份验证

最近项目中将一个网站的项目拆开,分别bu
  • king_wgm
  • king_wgm
  • 2014-08-20 10:49:30
  • 958

多个控件共用一个事件

以2个Button共用1个Click事件为例 using System;using System.Data;using System.Configuration;using System.Collec...
  • xiandawang
  • xiandawang
  • 2007-08-16 09:14:00
  • 2037
收藏助手
不良信息举报
您举报文章:在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
举报原因:
原因补充:

(最多只允许输入30个字)