原文: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

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/03/09/1406616.html

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

  1. 《南溪的目标检测学习笔记》——验证模式下出现“Process finished with exit code 137 (interrupted by signal 9: SIGKILL)“的问题

    1 问题描述 在验证模式下运行代码的时候,出现这样的错误: Process finished with exit code 137 (interrupted by signal 9: SIGKILL) ...

  2. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享 欢迎拍砖

    小论坛地址: http://rayyu.5d6d.com/thread-9444-1-1.html 正文: 首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. ...

  3. vue router.beforeEach跳转路由验证用户登录状态

    使用vue判断验证用户登录状态 导航钩子类似于生命周期钩子,包含路由进入前,进入后,更新时,退出前等几个周期,主要用于控制导航的前进后退或跳转等. 其中router.beforeEach就是路由进入前 ...

  4. 模拟用户登录过程,验证用户名、密码和校验码,如果全部正确提示用户登录成功,否则,提示用户相关输入错误

    要求:模拟用户登录过程,验证用户名.密码和校验码,如果全部正确提示用户登录成功,否则,提示用户相关输入错误. 目的:掌握登录校验的规则和原理. //登录验证 #include<stdio.h&g ...

  5. 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证

    当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需 ...

  6. ASP.NET Forms验证 实现子域名(SubDomain)共享登陆下的缺陷 [转]

    一.什么是单点登录 单点登录就是在多个web应用程序中,实现统一登录方式,一但登录了某web应用程序,其它相关联的web应用程 序都无需再次登录,一个地方退出,所有相关联的web应用程序都退出. 二. ...

  7. 浅谈ASP.NET Forms验证

    ASP.NET Forms验证 用户验证是每一个项目必须的一个模块,由于已经很久没有碰到这一块内容,今天写一个用户验证居然脑子一片空白.于是乎就和一个同事进行了一片讨论,晚上回家决定把讨论的结果给记录 ...

  8. 如何修改SQL Server 2000身份验证模式和系统管理员

    大家安装SQL Server 2000时,很多人都习惯性的一路下一步,最后就会以windows身份验证作为登录数据库服务器的方式,假如有一天你后悔了,想以sql server的验证方式登陆,那怎么办呢 ...

  9. 单realm模式下前后端分离实现springboot+shiro+jwt+vue整合

    shiro+jwt实现前后端分离 一.RBAC概念 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在R ...

最新文章

  1. mysql5.7 temp_MySQL5.7-学习笔记(kylix)-2019.3.29-tempundo
  2. FaaS、PaaS和无服务器体系结构的优势
  3. Python中函数的参数传递与可变长参数
  4. MYSQL查看和修改存储引擎
  5. Docker 初级教程
  6. [云炬创业学笔记]第二章决定成为创业者测试1
  7. iframe懒加载_前端常见问题
  8. css网格_一个CSS网格可以全部统治
  9. 【Python】处理 pydotplus.graphviz.InvocationException: GraphViz’s executables not found
  10. Selenium alert 弹窗处理
  11. 改变checkbox样式问题
  12. 2018-12-20 第二章Java 预习作业
  13. 小米笔记安装双系统linux,小米笔记本电脑怎么安装双系统?-小米win7
  14. OpenGL GLM环境配置
  15. H5 网络版坦克大战
  16. 浏览器网页打开与关闭快捷键
  17. python代码审查规则_python代码检查
  18. 【java】数组的定义以及初级运用精讲(起点闭关计划)
  19. 【视频分享】尚硅谷HTML5前端视频_Vue核心技术视频
  20. Smartbi与华为云强强联合,共建云上BI新生态

热门文章

  1. 9个前端动画库让你的交互更加性感
  2. 计算机视觉CV算法分类,计算机视觉(CV)的算法有哪些,具体都有哪些特点?...
  3. MySQL软件的下载
  4. 用例图(use case)
  5. 什么是泛型、为什么要使用以及泛型擦除
  6. Spring IoC容器管理的Bean能够被垃圾回收吗?
  7. 代码演示:获取锁时被中断
  8. sqoop导入-hive
  9. 部署RocketMQ的管理工具
  10. 后台服务系统之编写服务消费方实现