SSO介紹
背景
- 隨著企業(yè)的發(fā)展,一個大型系統(tǒng)里可能包含 n 多子系統(tǒng), 用戶在操作不同的系統(tǒng)時,需要多次登錄,很麻煩,我們需要一種全新的登錄方式來實現(xiàn)多系統(tǒng)應(yīng)用群的登錄,這就是單點登錄。
- web 系統(tǒng) 由單系統(tǒng)發(fā)展成多系統(tǒng)組成的應(yīng)用群,復(fù)雜性應(yīng)該由系統(tǒng)內(nèi)部承擔(dān),而不是用戶。無論 web 系統(tǒng)內(nèi)部多么復(fù)雜,對用戶而言,都是一個統(tǒng)一的整體,也就是說,用戶訪問 web 系統(tǒng)的整個應(yīng)用群與訪問單個系統(tǒng)一樣,登錄/注銷 只要1次就夠了
SSO 定義
- SSO(Single sign-on) 即單點登錄,一種對于許多相互關(guān)聯(lián),但是又是各自獨立的軟件系統(tǒng),提供訪問控制的方法
- SSO(Single sign-on) 是比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。SSO(Single sign-on) 定義是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)
以游樂場的通票為例:
在弓長嶺等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),弓長嶺網(wǎng)站建設(shè)費用合理。
我們只要買一次通票,就可以玩所有游樂場內(nèi)的設(shè)施,而不需要在過山車或者摩天輪那里重新買一次票。在這里,買票就相當于登錄認證,游樂場就相當于使用一套 SSO 的公司,各種游樂設(shè)施就相當于公司的各個產(chǎn)品。
類比到各個子系統(tǒng)認證,如圖
SSO 三種類型
-
各子系統(tǒng)在同一個站點下
-
各子系統(tǒng)在相同的頂級域名下
同一個站點和相同頂級域下的單點登錄是利用了 Cookie 頂域共享的特性。目前數(shù)棧都是只需要在 UIC 的登錄頁面進行一次登錄就可以在各個子應(yīng)用之間進行跳轉(zhuǎn),這種操作源于根據(jù)設(shè)置 Cookie 中的 domain 為頂級域名。
-
各子系統(tǒng)屬于不同的頂級域
如果屬于不同的域,不同域之間的 Cookie 是不共享的。怎么辦?接下來就要說一說 CAS (Central Authentication Service) 流程了,這個流程是單點登錄的標準流程
CAS (Central Authentication Service)
CAS 是什么
??Central Authentication Service ——— 中央認證服務(wù),是 Yale 大學(xué)發(fā)起的一個企業(yè)級的、開源的項目,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的 SSO 解決方案。只是 SSO 解決方案的一種,它的流程其實跟 Cookie-session 模式是一樣的,單點登錄等于說是每個子系統(tǒng)都擁有一套完整的 Cookie-session 模式,再加上一套 Cookie-session 模式的 SSO 系統(tǒng)。
第一次訪問 APP1:
- 用戶訪問 APP1,需要登錄的時候會重定向到 CAS Server
- 在 CAS Server 進行賬號密碼認證,CAS Server 會保存 session,并生成 sessionId 返回給 SSO Client,SSO Client 寫入當前域的 Cookie,同時根據(jù) TGT 簽發(fā)1個 ST 傳入 APP1
- APP1 攜帶 ST 向 CAS Server 請求校驗
- CAS Server 校驗成功后,返回 登錄態(tài)給 APPI 服務(wù)端
- APPI 服務(wù)端 將 登陸態(tài)寫入 session 并生成 sessionId 返回給 APPI Client
- 之后再做登錄認證,就是同域下的認證了
第一次訪問 APP2:
- 用戶訪問系統(tǒng) APP2,當跳到 SSO 里準備登錄的時候發(fā)現(xiàn) SSO 已經(jīng)登錄了,那 SSO 生成一個 ST,攜帶該 ST 傳入 APP2
- APP2 攜帶 ST 向 CAS Server 請求校驗
- CAS Server 校驗成功后,返回 登錄態(tài)給 APP2 服務(wù)端
- APP2 服務(wù)端 將 登陸態(tài)寫入 session 并生成 sessionId 返回給 APPI Client
- 在這個流程里,APP2 就不用走登錄流程了
CAS 票據(jù)
TGT
?CAS Server 創(chuàng)建TGT,存在 CAS Server 的 Session 里面,根據(jù)用戶信息簽發(fā)的
TGC
?創(chuàng)建 TGT 的同時,生成 TGC。通過 CAS Server 的 response header 的 set-cookie 字段設(shè)置 TGC,唯一標識用戶身份(sessionId) ST
ST
?根據(jù) TGT 簽發(fā)的 ST,是 CAS 為用戶簽發(fā)的訪問某一 service 的票據(jù)
CAS 單點登錄(SSO) & 單點登出(SLO)
單點登錄(SSO)
第一次訪問 APP1:
- 訪問 APP1 服務(wù)地址,APP1 請求未通過認證,重定向至 CAS Server 地址。
- 訪問 CAS Server 地址,發(fā)送認證請求,帶上 Cookie。
- CAS Server 識別出用戶沒有 Cookie 信息,沒有登錄,返回 CAS 登陸頁地址。
- 用戶輸入正確的賬戶密碼,CAS Server 用戶認證通過,創(chuàng)建 SSO Session。
- 重定向回 APP1 的服務(wù)地址,并在 cookie 中創(chuàng)建了 CASTGC,TGC 中包含了 Ticket(TGT),TGT 就是 SSO Session 的 key。
- 訪問 APP1 的服務(wù)地址,并帶上 ST,客戶端拿到 ST 向CAS Server進行認證。
- CAS Server 認證成功,返回響應(yīng)信息給 APPI
- APPI 拿到成功的響應(yīng)后,設(shè)置 Session,并重定向回 APP1 的地址,并設(shè)置 Cookie JSESSIONID。
- APPI 發(fā)起請求,帶上 Cookie 中的信息,其中 JSESSIONID 用來確定當前用戶所對應(yīng)的 session 信息,發(fā)送給客戶端進行校驗。
- 客戶端使用 JSESSIONID 與 Session 中存儲的數(shù)據(jù)進行校驗。
- 校驗通過,返回正確的內(nèi)容,展示 APP1
第二次訪問 APP1:
- APPI 發(fā)起請求,并帶上 Cookie 中的 JSESSIONID 給 APPI 服務(wù)端。
- APPI 服務(wù)端 使用 JSESSIONID 與 Session 中存儲的數(shù)據(jù)進行校驗。
- 校驗通過,返回正確的內(nèi)容,展示 APP1 。
在 APP1 登陸成功的情況下,第一次訪問 APP2:
- 訪問 APP2 服務(wù)地址,APP2 請求未通過認證,重定向至 CAS Server 地址。
- 訪問 CAS Server 地址,發(fā)送認證請求,帶上 TGT 信息。
- CAS Server 通過 TGT 去查找 SSO 的信息進行認證。
- 認證通過,生成票據(jù) ST 重定向至 APP2 的服務(wù)地址。
- APP2 服務(wù) 攜帶 ST 向 CAS Server 進行認證。
- CAS Server 認證成功,返回客戶端通過的響應(yīng)。
- 客戶端拿到成功的響應(yīng)后,設(shè)置 Session,并重定向至 APP2 的地址,并設(shè)置 Cookie MOD_AUTH_CAS_S。
- APP2 發(fā)起請求,帶上 Cookie 中的 MOD_AUTH_CAS_S ,發(fā)送給客戶端進行校驗。
- 客戶端使用 MOD_AUTH_CAS_S 與 Session 中存儲的數(shù)據(jù)進行校驗。
- 校驗通過,返回正確的內(nèi)容,展示 APP2。
官方時序圖
單點登出(SLO)
- 在 APP1 平臺 請求退出登錄后, 先在 query 中 攜帶 service 字段 重定向 CAS 登出地址
- 用戶攜帶 service query 字段和 CASTGC 請求到 CAS Server
- CAS Server 根據(jù) CASTGC 找到 TGT的信息,刪除 TGT 完成 CAS 的注銷
- CAS Server 可以在 TGT 中拿到關(guān)聯(lián)的所有 ST, 根據(jù) ST 找到對應(yīng)的應(yīng)用注冊信息,調(diào)用其中的 logoutUrl,把 ST 包裝到 logoutRequest 發(fā)送給 APP1
- APP1 根據(jù) logoutRequest 找到 ST ,查找 Session 中以 ST 為鍵的值刪除,清除登陸狀態(tài)
- APP1 登出成功
- APP2 根據(jù) logoutRequest 找到 ST ,查找 Session 中以 ST 為鍵的值刪除,清除登陸狀態(tài)
- APP2 登出成功
名稱欄目:聊聊單點登錄(SSO)中的CAS認證
文章位置:
http://weahome.cn/article/dsojseh.html