單點登陸實現原理(SSO)
簡介
- 單點登陸是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統的保護資源,若用戶在某個應用系統中進行註銷登陸,全部的應用系統都不能再直接訪問保護資源,像一些知名的大型網站,如:淘寶與天貓、新浪微博與新浪博客等都用到了這個技術。
原理
-
單點登陸html
- 有一個獨立的認證中心,只有認證中心才能接受用戶的用戶名和密碼等信息進行認證,其餘系統不提供登陸入口,只接受認證中心的間接受權。間接受權經過令牌實現,當用戶提供的用戶名和密碼經過認證中心認證後,認證中心會建立受權令牌,在接下來的跳轉過程當中,受權令牌做爲參數發送給各個子系統,子系統拿到令牌即獲得了受權,而後建立局部會話。
- 示例:
下面對上圖進行解釋:-
當用戶還沒進行用戶登陸的時候web
- 用戶去訪問系統1的保護資源 ,系統1檢測到用戶還沒登陸,跳轉至SSO認證中心,SSO認證中心也發現用戶沒有登陸,就跳轉到用戶至認證中心的登陸頁面
- 用戶在登陸頁面提交用戶相應信息後,認證中心會校驗用戶信息,若是用戶信息正確的話認證中心就會建立與該用戶的全局會話(全局會話過時的時候,用戶就須要從新登陸了。全局會話中存的信息可能有令牌,用戶信息,及該在各個系統的一些狀況),同時建立受權令牌,而後進行下一步,不然認證中心給出提示(用戶信息有誤),待用戶再次點擊登陸的時候,再一次進行校驗用戶信息
- 認證中心帶着令牌跳轉到用戶最初請求的地址(系統1),系統1拿到令牌後去SSO認證中心校驗令牌是否有效,SSO認證中心校驗令牌,若該令牌有效則進行下一步
- 註冊系統1,而後系統1使用該令牌建立和用戶的局部會話(若局部會話過時,跳轉至SSO認證中心,SSO認證中心發現用戶已經登陸,而後執行第3步),返回受保護資源
-
用戶已經經過認證中心的認證後
用戶訪問系統2的保護資源,系統2發現用戶未登陸,跳轉至SSO認證中心,SSO認證中心發現用戶已經登陸,就會帶着令牌跳轉回系統2,系統2拿到令牌後去SSO認證中心校驗令牌是否有效,SSO認證中心返回有效,註冊系統2,系統2使用該令牌建立與用戶的局部會話,返回受保護資源。
api -
若是系統1的局部會話存在的話,當用戶去訪問系統1的保護資源時,就直接返回保護資源,不須要去認證中心驗證了跨域
-
局部會話存在,全局會話必定存在;全局會話存在,局部會話不必定存在;全局會話銷燬,局部會話必須銷燬
若是在校驗令牌過程當中發現客戶端令牌和服務器端令牌不一致或者令牌過時的話,則用戶以前的登陸就過時了,用戶須要從新登陸
服務器關於令牌可參考:基於跨域單點登陸令牌的設計與實現restful
-
單點註銷markdown
- 在一個子系統中註銷,全局會話也會被註銷,全部子系統的會話都會被註銷
- 示例:
用戶向系統1發出註銷請求,系統1根據用戶與系統1創建的會話id從會話中拿到令牌,向SSO認證中心發起註銷請求,認證中心校驗令牌有效,會銷燬全局會話,同時取出此令牌註冊的系統地址,認證中心向全部註冊系統發出註銷請求,各系統收到註銷請求後銷燬局部會話,認證中心引導用戶跳轉值登陸頁面。
-
總體陳述post
- 單點登陸涉及SSO認證中心與多個子系統,子系統與SSO認證中心須要通訊(交換令牌、校驗令牌及發起註銷請求等),子系統中包含SSO的客戶端,SSO認證中心是服務端
- 認證中心與客戶端通訊可經過 httpClient、web service、rpc、restful api(url是其中一種) 等實現
- 客戶端與服務器端的功能
- 客戶端:
- 攔截子系統未登陸用戶請求,跳轉至sso認證中心
- 接收並存儲sso認證中心發送的令牌
- 與服務器端通訊,校驗令牌的有效性
- 創建局部會話
- 攔截用戶註銷請求,向sso認證中心發送註銷請求
- 接收sso認證中心發出的註銷請求,銷燬局部會話
- 服務器端:
- 驗證用戶的登陸信息
- 建立全局會話
- 建立受權令牌
- 與客戶端通訊發送令牌
- 校驗客戶端令牌有效性
- 系統註冊
- 接收客戶端註銷請求,註銷全部會話
- 客戶端:
大體思路是:網站
訪問業務系統時,由自定義的[Authorize]進行攔截url
獲取到Token設置到請求頭進行HttpPost到認證系統提供的/api/token/Authentication接口
響應給業務系統若是是成功則繼續訪問,若是是失敗則401或者跳轉到登陸頁。
具體步驟:
- 認證中心登陸成功後,請求登陸中心接口得到token
- 攜帶token逐個跳轉到業務系統的中轉頁面。
- 跳轉完成後,返回到認證中心登陸頁面進行引導。
另外可使用IdentityServer4實現單點登陸統一認證 做爲認證中心
轉載:http://www.cnblogs.com/zhuchenglin/p/8968530.html http://www.javashuo.com/article/p-sfwzivvf-kk.html