在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

使用ngrok把本地项目发布到公网

使用ngrok把本地项目发布到公网
  • zhanglingxing
  • zhanglingxing
  • 2016年10月13日 11:24
  • 268

CentOS系列之LNPM环境搭建

以下操作以CentOS 6为例 1、跟换yum源需要的话猛戳这里2、安装Mysql 以目前最新的mysql5.7为例 2.1、下载发行包猛戳这里:http://dev.mysql.com/down...
  • qq_33261700
  • qq_33261700
  • 2017年12月29日 23:53
  • 48

何谓 Add-on Domain,Subdomain,Parked domain,无限个又代表甚么意思?

当注册完成之后,您会有一个虚拟主机账号的主域名称,例如您的是 www.car.com做为域名。每一个虚拟主机账号都需要有一个域名,才可以依这个域名进行浏览、收发信件等等。 我们介绍的虚拟主机所提供的...
  • ljguo212
  • ljguo212
  • 2013年04月24日 00:00
  • 689

增加 tenant(租客)服务

作者:韩卫林,中国运营经理,马衡达信息技术(上海)有限公司 如果您还没有Predix试用帐号,请访问https://supportcentral.ge.com/esurvey/GE_su...
  • PredixCN
  • PredixCN
  • 2017年04月17日 11:07
  • 554

从subdirectory到subdomain的悲惨教训

There is always debates over subfolders and subdomains in the seo world. And I myself could too ofte...
  • Solmyr_biti
  • Solmyr_biti
  • 2017年01月13日 01:02
  • 486

为你的域名添加子域名(二级域名)并绑定网站

可能更新不及时,建议去原文看最新版有没有想过为自己的域名添加一个子域名来建一个分站?或者用来测试? 那就进来吧 确定可添加子域名的个数访问你注册域名的注册商,仔细找找,这里拿 Namesilo...
  • XcantloadX
  • XcantloadX
  • 2017年11月19日 11:26
  • 303

kubernetes1.7集群创建过程

前言关于kubernetes时什么以及kubernetes的相关介绍,可以去网络搜索或着去我的另一篇博客kubernetes(k8s)集群搭建一、实验环境系统:Red Hat Enterprise L...
  • Running_free
  • Running_free
  • 2017年10月31日 00:56
  • 374

dns(bind)配置详解(三)

7.server语句 服务器(server)语句的定义和使用: server ip_addr { [ bogus yes_or_no ; ] [ provide-ixfr ye...
  • bpingchang
  • bpingchang
  • 2014年08月07日 22:45
  • 1471

ngrok 本机代码部署外网访问神器

背景:听哥们说了个工具ngrok,可以让本机配置的web服务在外网访问,抱着将信将疑的态度试了试,发现还真的可以。下面记录下我自己的安装步骤,另外谈下自己还有些疑问的地方。 参考资料网站:htt...
  • gebitan505
  • gebitan505
  • 2014年09月23日 14:09
  • 34903

(精)tomcat 二级域名 session共享

Tomcat下,不同的二级域名之间或根域与子域之间,Session默认是不共享的,因为Cookie名称为JSESSIONID的Cookie根域是默认是没设置 的,访问不同的二级域名,其Cookie就重...
  • it_man
  • it_man
  • 2014年08月04日 11:33
  • 11704
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
举报原因:
原因补充:

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