SSO是老生常談的話題了,但部分同窗對SSO可能掌握的也是雲裏霧裏,只知其一;不知其二。本次手撕公司的SSO登錄原理,試圖以一種簡單,流暢的形式爲你提供 有用的SSO登錄原理。web
按照本人一向行文風格,咱們先說什麼是SSO,爲何要提出SSO?api
SSO: 在多個系統中,只須要登錄一次,就能夠訪問其餘相互信任的應用系統, 這個技術的提出解決了:瀏覽器
企業運行了多個服務,而帳號須要集中統一管理cookie
終端用戶登錄一次,便可使用一個帳戶享受全部不一樣域名下服務。spa
SSO 與CAS(Central Authentication System)這個概念密切相關,帳戶集中由某個服務管理,SSO服務只負責登錄認證。code
登錄認證與【服務端在瀏覽器上寫入的認證Cookie】密切相關, Cookie 有一系列重要屬性:Domain,Path, Expiration,HttpOnly 決定了該Cookie 在客戶端的做用域、做用範圍、有效事件、有效操做方式blog
① 用戶訪問website1 系統,website1系統須要認證, 用戶當前沒有登錄事件
② website1給客戶端返回302重定向響應, 客戶端重定向到SSO服務頁作用域
# 交互過程確實是臨時跳轉,下面傳參false, 返回302臨時重定向響應 域名
context.Response.Redirect(ssoURL, false);
用戶並無登錄SSO系統,因此SSO系統會返回登錄界面
③ 用戶在SSO登錄界面輸出帳戶/密碼
④ 登錄成功,SSO會在客戶端寫入一個 cookie for sso併產生一個301重定向響應,客戶端將重定向到原website1地址,該請求附帶了SSO給與此次認證成功的 ticket
http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO
⑤ website1收到以上重定向請求,解析QueryString中的ticket, 向SSO作一次ticket驗證; 驗證經過向客戶端寫入本站的 cookie for website
⑥ 上面第5步,瀏覽器地址會顯示:http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO, 在本站驗證經過以後,最好再作一個重定向,返回業務首頁:www.website1.com, 本步驟不是SSO登錄的標準流程。
① 用戶訪問website2, 用戶在website2並沒獲得認證;跳轉回 SSO
② SSO服務檢測到該 用戶在SSO域下存在Cookie for sso, 認定該用戶已經登錄,故跳轉回website2, 如上也會攜帶認證ticket
③ 如上,website2收到 website2.com?ticket=XXXX-OOOO-XXXX-OOOO請求, 會作一次SSO驗證; 驗證成功,寫入本站cookie for website2
① SSO認證成功,寫入的cookie for sso, 是登錄到其餘系統的關鍵
② website1收到SSO認證成功的重定向請求,解析出 ticket=XXXX-OOOO-XXXX-OOOO, 爲何還要作一次SSO驗證?
由於website1收到的來自SSO的重定向請求地址,有多是僞造, 因此在website1中須要去SSO驗證一次。
③ 標準的CAS登錄流程有兩次302客戶端重定向, 分別由原站點website1和SSO啓動。
理論上 整個流程由服務端重定向也是能夠的 ?? 看官若發現有漏洞,可在評論區回覆。
④ 退出SSO登錄, 要作兩件事情:
- 向SSO發起api請求,請求SSO刪除用戶在SSO域下的認證cookie for sso
- 移除本站的cookie for website1
⑤ 每一個website,至少須要以下sso配置
"SsoOptions": { "BaseAddress": "https://sso-cas.sso.com", // 基地址 "LoginPath": "/login", // sso登錄地址 "LogoutPath": "/api/logout", // 退出sso登錄的api地址 "ValidateTGTPath": "/api/validate", // 驗證ticket的api地址 "UserInfoPath": "/api/v2/userinfo" // 從sso拿到登錄用戶信息的api地址 },
That' all,這是本身對SSO登錄的一些理解, 本圖文 但願以流暢的思路記錄SSO, 但願各位看官不要吃快餐,知其然更知其因此然很關鍵。