首页  ·  知识 ·  编程语言
Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状
佚名  http://www.netfocus.cn/  .NET  编辑:dezai  图片来源:网络
享用户登录状态的原理解释如下: Asp.net中的Forms验证方式,在服务端通过用户验证的代码一般如下:FormsAuthentication.RedirectFromLoginPage

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

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

本文作者:佚名 来源:http://www.netfocus.cn/
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读