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模塊,咱們平臺在用於不須要去關注它......

感謝各位對本文章的支持,但願對各位全部幫助!

回到目錄

相關文章
相關標籤/搜索