中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Lind.DDD.SSO單點(dian)登陸組件的使(shi)用(原創(chuang))

回到目錄

一般sso的說明

在Lind.DDD框(kuang)架(jia)里(li),有對(dui)單點登陸(lu)的(de)(de)(de)集(ji)成(cheng),原理就(jiu)是各個(ge)網(wang)(wang)站(zhan)去(qu)sso網(wang)(wang)站(zhan)統(tong)一登陸(lu)授(shou)權,之(zhi)后(hou)在sso網(wang)(wang)站(zhan)將登陸(lu)的(de)(de)(de)token進行存儲(chu)(chu),存儲(chu)(chu)方式隨你(ni)(cache,redis,mongodb,file),之(zhi)后(hou)業(ye)務(wu)平(ping)(ping)臺(tai)在訪(fang)問資源時(shi),如(ru)果這些資源需要用戶登陸(lu)才(cai)能訪(fang)問,就(jiu)會(hui)去(qu)sso網(wang)(wang)站(zhan)取token,再根(gen)據token去(qu)憑證,然(ran)后(hou)將cookies(由sso域(yu)名+token值組成(cheng))存儲(chu)(chu)到自己(ji)瀏覽器的(de)(de)(de)cookies里(li),同時(shi)在自己(ji)的(de)(de)(de)業(ye)務(wu)平(ping)(ping)臺(tai)也存儲(chu)(chu)的(de)(de)(de)登陸(lu)狀(zhuang)(zhuang)態,當退出(chu)后(hou),將sso上(shang)(shang)存儲(chu)(chu)的(de)(de)(de)信息清空(kong),其它業(ye)務(wu)平(ping)(ping)臺(tai)登陸(lu)狀(zhuang)(zhuang)態保持不變(bian),當然(ran)我們的(de)(de)(de)token和session都有自己(ji)的(de)(de)(de)超(chao)時(shi)時(shi)間,這個(ge)可以根(gen)據需要去(qu)設(she)置。對(dui)于業(ye)務(wu)平(ping)(ping)臺(tai)只需要添加統(tong)一的(de)(de)(de)Filter即可,在業(ye)務(wu)平(ping)(ping)臺(tai)的(de)(de)(de)登陸(lu)功能上(shang)(shang),直接調用框(kuang)架(jia)里(li)的(de)(de)(de)登出(chu)功能,而sso也只需要實現登陸(lu)頁面,并調用框(kuang)架(jia)的(de)(de)(de)登陸(lu)功能!

大叔sso里各模塊的關系

大叔sso的工作流程

  

對于代碼,我們(men)在(zai)客戶端開(kai)放(fang)一個(ge)Filter,用來作授(shou)權,它與sso服務器會有幾次通(tong)訊(幾次握手)分別是:

-》從sso取一個token

-》將token存儲到本機cookies上

-》通過token去服務器取憑證Credence

-》將Credence存儲到業務平臺的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;

            //令牌(pai)存儲在第三(san)方Session,退(tui)出(chu)只退(tui)自己平(ping)臺的(de)賬(zhang)號
            if (Session[TOKEN_KEY] != null)
            {
                //分站憑證存在
                //恭喜,分站憑證(zheng)存在,您被授權(quan)訪問該頁(ye)面!
                Lind.DDD.Logger.LoggerFactory.Instance.Logger_Debug("恭喜,分站憑證存(cun)在(zai),您(nin)被授權(quan)訪問該頁面!");
            }
            else
            {
                //令牌驗證結果
                if (Request.QueryString[TOKEN_KEY] != null)
                {
                    if (Request.QueryString[TOKEN_KEY] != "$Token$")
                    {
                        //持有令牌
                        string tokenValue = Request.QueryString[TOKEN_KEY];

                        //調用WebService獲(huo)取主站憑證(zheng)[3]
                        var o = new WebClient().DownloadString(getCredenceUri + tokenValue);
                        if (!string.IsNullOrWhiteSpace(o))
                        {
                            //令牌正確[5,結束(shu)]
                            Session[TOKEN_KEY] = o;
                            //序(xu)列化用戶信息(xi)
                            var obj = o.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
                            Lind.DDD.Authorization.CurrentUser.Serialize(obj[0], obj[1]);
                            //恭喜(xi),令(ling)牌存在,您被授權訪問該頁面!
                            Lind.DDD.Logger.LoggerFactory.Instance.Logger_Debug("恭喜,令牌(pai)存在,您被授權訪問該頁面!");
                        }
                        else
                        {
                            //令牌錯誤[4]
                            filterContext.Result = new RedirectResult(this.replaceToken());
                        }
                    }
                    else
                    {
                        //未持有令牌(pai)[2],獲取(qu)令牌(pai)
                        filterContext.Result = new RedirectResult(this.replaceToken());
                    }
                }
                //沒能領(ling)取(qu)令牌(pai),去(qu)主(zhu)站領(ling)取(qu)[1]$Token$
                else
                {
                    filterContext.Result = new RedirectResult(this.getTokenURL());
                }
            }
            base.OnActionExecuting(filterContext);
        }
View Code

對于sso來說,只(zhi)需要實現登陸方法即可,代碼非常簡潔!

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

而對(dui)于(yu)業務平臺來說(shuo),你完全可(ke)以添(tian)加一個全局過濾器,或者在需(xu)要的控制(zhi)器上添(tian)加SSOActionFilter特(te)性即可(ke),代碼(ma)依然十分(fen)簡(jian)潔!

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

業務平臺(tai)自己控制(zhi)登出(chu)方法,當然也(ye)是調用框(kuang)架(jia)里封(feng)裝的方法!

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

當前(qian),對于(yu)sso這(zhe)個功(gong)能來說,復雜的代碼已經封裝在(zai)了Lind.DDD.SSO模塊,我們平臺在(zai)用于(yu)不需要去關注它......

感(gan)謝各(ge)(ge)位(wei)對本文章的支持,希望對各(ge)(ge)位(wei)所有幫助!

回到目錄

posted @ 2016-10-26 16:42  張占嶺  閱讀(1785)  評論(2)    收藏  舉報