回到目錄html
在Lind.DDD框架裏,有對單點登錄的集成,原理就是各個網站去sso網站統一登錄受權,以後在sso網站將登錄的token進行存儲,存儲方式隨你(cache,redis,mongodb,file),以後業務平臺在訪問資源時,若是這些資源須要用戶登錄才能訪問,就會去sso網站取token,再根據token去憑證,而後將cookies(由sso域名+token值組成)存儲到本身瀏覽器的cookies裏,同時在本身的業務平臺也存儲的登錄狀態,當退出後,將sso上存儲的信息清空,其它業務平臺登錄狀態保持不變,固然咱們的token和session都有本身的超時時間,這個能夠根據須要去設置。對於業務平臺只須要添加統一的Filter便可,在業務平臺的登錄功能上,直接調用框架裏的登出功能,而sso也只須要實現登錄頁面,並調用框架的登錄功能!redis
對於代碼,咱們在客戶端開放一個Filter,用來做受權,它與sso服務器會有幾回通信(幾回握手)分別是:mongodb
-》從sso取一個token瀏覽器
-》將token存儲到本機cookies上服務器
-》經過token去服務器取憑證Credencecookie
-》將Credence存儲到業務平臺的session上session
-》用戶在sso受權成功,完成了統一登錄,用戶訪問這個業務平臺,因爲憑證存儲在session上,因此,本用戶處理登錄狀態框架
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); }
對於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模塊,咱們平臺在用於不須要去關注它......
感謝各位對本文章的支持,但願對各位全部幫助!