zoukankan      html  css  js  c++  java
  • ASP.NET站点跨子域名单点登陆(SSO)的实现

    在MSDN的文档“配置跨应用程序的 Forms 身份验证(http://msdn2.microsoft.com/zh-CN/library/eb0zx8fc.aspx)” 中,提出了在Web Farm和多个应用程序之间实现共享身份登陆信息的方法。这个方法实现的其实是场环境下的身份共享,对于跨子域名的单点登陆,如网易和CSDN的通行证的实现,也有很多朋友给出了解决方案,参见:http://www.cnblogs.com/dudu/archive/2005/07/04/186279.html

    Form验证其实是基于身份cookie的验证。客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web.config里Authentication节form设定的name信息,如

    <authentication mode="Forms">
       <forms loginUrl="login.aspx" name=".ASPXAUTH" path="/" protection="All" ></forms>
     </authentication>

    这里,.ASPNETAUTH就是这个Cookie的名字。通过在Request.Cookies集合里包含这个cookie,实现用户身份信息的传递。所以,共享身份验证信息的思路很简单:只要这个身份验证cookie能在自域名中共享,Form验证信息自然可以共享!

    共享Cookie的文章网上很多,基本的做法就是设定Cookie的domain属性。cookie的domain指定了此cookie所关联的域。domain默认为String.Empty,表示关联的域是当前Request对应的域。如果domain设定一个子域名,如cookie.Domain="brookes.com",则表示此cookie关联brookes.com下所有的下级域。因此,可以被www.brookes.com/web2.brookes.com......等共享。

    至此,实现跨子域名的Form验证信息共享的方法就很简单:

     if (Membership.ValidateUser(userName, password))
              
    {
                    FormsAuthentication.SetAuthCookie(userName.Text, 
    false);
                    HttpCookie cookie 
    = Response.Cookies[FormsAuthentication.FormsCookieName];
                    cookie.Domain 
    = ".brookes.com";
                    Response.Cookies.Add(cookie);
                    FormsAuthentication.RedirectFromLoginPage(userName,
    false);
                }

    这个代码说明的是实现的原理。这里,实现的自己写Form验证的过程。如果使用的是Login控件,由framework自己完成验证,怎么设定这个cookie的domain呢?

    可以有三种方式:

    1. 在Login.OnLoggedIn事件中处理。这个事件在用户通过身份验证后触发,验证cookie已经存在,可以修改其domain属性,代码参考上面;
    2. 将验证用户、设定AuthCookie的过程写成一个HttpMoudle。这个方法稍负责,可google代码
    3.有一个最最最简单的方法,在.net 2.0 中,Authticainon的forms元素新添了一个属性:domain。这个属性对应的就是form的AuthCookie的domain属性。因此,只需要在每个子域的web.config中作如下设置:

    <authentication mode="Forms">
       <forms loginUrl="login.aspx" name=".ASPXAUTH" path="/" protection="All" domain="brookes.com"></forms>
     </authentication>

    OK,现在你不需要作任何其他设置了,你的brookes.com下所有的子域都可以共享form验证身份信息了!

    还要说明几点:
    1. 这个domain属性会覆盖在httpCookie配置节的domain属性设置,但是只会影响到AuthCookie,其他cookie不受影响;
    2. 看了上面这一条,当然会想到我可以设定httpCookies配置节,如:
       <httpCookies domain="brookes.com"/>
      效果是一样的。不同指出在于,httpCookies指定了站点内所有cookie的domain属性,这将导致站点内所有的cookie都可以在子域间共享!至于这种共享是需要还是该避免,根据需要具体判断。
    3. 这个domain属性,我看到在有的文档里强调在前面加一个点,如domain=".brookes.com",而MS的文档里都没有这个点。根据我的测试结果,两个写法没有区别,效果一样。

  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/kokoliu/p/490244.html
Copyright © 2011-2022 走看看