Lind.DDD.SSO单点登录组件的使用(原创)

回到目录html

通常sso的说明

在Lind.DDD框架里,有对单点登录的集成,原理就是各个网站去sso网站统一登录受权,以后在sso网站将登录的token进行存储,存储方式随你(cache,redis,mongodb,file),以后业务平台在访问资源时,若是这些资源须要用户登录才能访问,就会去sso网站取token,再根据token去凭证,而后将cookies(由sso域名+token值组成)存储到本身浏览器的cookies里,同时在本身的业务平台也存储的登录状态,当退出后,将sso上存储的信息清空,其它业务平台登录状态保持不变,固然咱们的token和session都有本身的超时时间,这个能够根据须要去设置。对于业务平台只须要添加统一的Filter便可,在业务平台的登录功能上,直接调用框架里的登出功能,而sso也只须要实现登录页面,并调用框架的登录功能!redis

大叔sso里各模块的关系

大叔sso的工做流程

  

对于代码,咱们在客户端开放一个Filter,用来做受权,它与sso服务器会有几回通信(几回握手)分别是:mongodb

-》从sso取一个token浏览器

-》将token存储到本机cookies上服务器

-》经过token去服务器取凭证Credencecookie

-》将Credence存储到业务平台的session上session

-》用户在sso受权成功,完成了统一登录,用户访问这个业务平台,因为凭证存储在session上,因此,本用户处理登录状态框架

SSOActionFilter核心代码展现

        public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {

            var Request = filterContext.HttpContext.Request;
            var Response = filterContext.HttpContext.Response;
            var Session = filterContext.HttpContext.Session;
            Session.Timeout = 30;

            //令牌存储在第三方Session,退出只退本身平台的帐号
            if (Session[TOKEN_KEY] != null)
            {
                //分站凭证存在
                //恭喜,分站凭证存在,您被受权访问该页面!
                Lind.DDD.Logger.LoggerFactory.Instance.Logger_Debug("恭喜,分站凭证存在,您被受权访问该页面!");
            }
            else
            {
                //令牌验证结果
                if (Request.QueryString[TOKEN_KEY] != null)
                {
                    if (Request.QueryString[TOKEN_KEY] != "$Token$")
                    {
                        //持有令牌
                        string tokenValue = Request.QueryString[TOKEN_KEY];

                        //调用WebService获取主站凭证[3]
                        var o = new WebClient().DownloadString(getCredenceUri + tokenValue);
                        if (!string.IsNullOrWhiteSpace(o))
                        {
                            //令牌正确[5,结束]
                            Session[TOKEN_KEY] = o;
                            //序列化用户信息
                            var obj = o.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
                            Lind.DDD.Authorization.CurrentUser.Serialize(obj[0], obj[1]);
                            //恭喜,令牌存在,您被受权访问该页面!
                            Lind.DDD.Logger.LoggerFactory.Instance.Logger_Debug("恭喜,令牌存在,您被受权访问该页面!");
                        }
                        else
                        {
                            //令牌错误[4]
                            filterContext.Result = new RedirectResult(this.replaceToken());
                        }
                    }
                    else
                    {
                        //未持有令牌[2],获取令牌
                        filterContext.Result = new RedirectResult(this.replaceToken());
                    }
                }
                //没能领取令牌,去主站领取[1]$Token$
                else
                {
                    filterContext.Result = new RedirectResult(this.getTokenURL());
                }
            }
            base.OnActionExecuting(filterContext);
        }
View Code

对于sso来讲,只须要实现登录方法便可,代码很是简洁!ide

   if (isPass)
   {
      return SSOManager.LoginSSO("1","zzl",form["BackUrl"]);
   }

而对于业务平台来讲,你彻底能够添加一个全局过滤器,或者在须要的控制器上添加SSOActionFilter特性便可,代码依然十分简洁!网站

 [SSOActionFilter]
  public ActionResult Index()
  {
    return View();
  }

业务平台本身控制登出方法,固然也是调用框架里封装的方法!

   public ActionResult Logout()
   {
      SSOManager.ExitSSO();
      return RedirectToAction("Index");
   }

当前,对于sso这个功能来讲,复杂的代码已经封装在了Lind.DDD.SSO模块,咱们平台在用于不须要去关注它......

感谢各位对本文章的支持,但愿对各位全部帮助!

回到目录

相关文章
相关标签/搜索