1. 程式人生 > >C/S架構程序多種類服務器之間實現單點登錄

C/S架構程序多種類服務器之間實現單點登錄

代碼 支持 無法 註冊 概率 檢查 ip地址 用戶訪問 .html

(一)

在項目開發的過程中,經常會出現這樣的情況:我們的產品包括很多,以QQ舉例,如登陸、好友下載、群下載、網絡硬盤、QQ遊戲、QQ音樂等,總不能要求用戶每次輸入用戶名、密碼吧,為解決這個問題,高手提出了一個很好的跨平臺、跨應用的身份驗證解決方案,那就是——單點登錄(Single Sign On),簡稱為 SSO。
一、 什麽是單點登錄(Single Sign On)
單點登錄(SSO,Single Sign-on)是一種方便用戶訪問多個系統的技術,用戶只需在登錄時進行一次註冊,就可以在多個系統間自由穿梭,不必重復輸入用戶名和密碼來確定身份。
二、如何實現單點登錄(SSO)

1、整體設計思路
首先我們要明確單點登錄的運行模式,即統一身份驗證,在解決方案中,一般通過認證服務器(LoginServer)實現用戶身份驗證,驗證通過後將自動隨機生成身份驗證票據,並將身份驗證票據發送給用戶,待用戶訪問其他應用時,只對身份驗證票據進行合法性驗證即可。
2、認證服務器(LoginServer)實現的功能
在解決方案中,LoginServer提供的功能包括用戶名/密碼驗證、身份驗證票據的生成、身份驗證票據的合法性驗證這三個最基本的功能,其他功能可以根據用戶的需求,自行擴展。
由於LoginServer基於網絡通訊,使用TCP或UDP協議,所以其本身是跨平臺的,只要各個應用在開發過程中使用的開發語言支持身份驗證票據驗證,即可調用身份驗證平臺進行相關的操作。
3、身份驗證票據
所謂身份驗證票據就是用戶身份驗證通過後,發給用戶用以標示身份驗證通過的信息。身份驗證票據中可以加密保存用戶的身份信息或某一特定的驗證信息等,一般使用對稱加密,方便在身份驗證票據合法性的檢查中進行相應的解密。C/S結構的程序,票據保存比較方便,只要其他應用能夠取到就可以。
4、驗證票據
用戶拿到身份驗證票據後,當登錄B系統時,把這個票據傳給B系統,B系統拿這個票據系統到LoginServer進行認證即可。

(二)

在上面文檔中,初步介紹了S架構程序多種類服務器之間實現單點登錄的流程,可是當用戶量巨大或某項產品的重復登錄頻繁時,這種單點登錄(SSO)實現就出現了瓶頸,如下:

多臺LoginServer服務器之間共享數據比較困難,只能通過共享內存或數據庫共享,很難跨機房部署。
隨著業務量的增加,LoginServer服務的需求量也直線上升,而且出現問題的概率很高,經常造成正常用戶的認證失敗。
為解決上述問題,建議票據的認證有子系統的服務器完成,從而降低出現問題的概率,減少服務器壓力。具體的方法如下:
1、加密身份驗證票據
LoginServer服務器使用對稱加密算法加密身份驗證票據,如RC6、AES和Blowfish等,票據內容包括用戶名、認證時間、IP地址、自定義數據等信息。客戶端登錄後,LoginServer把加密後的密串通知給客戶端。
2、驗證身份票據
其他系統和LoginServer服務器共享對稱加密算法和密鑰,拿到客戶端的密串後使用相同算法和密鑰解密,然後對比用戶名、認證時間、IP地址、自定義數據等,如相同則允許登錄。
3、安全問題
我們知道對稱加密算法的破解是有可能的,在算法已知的情況下,密鑰、明文、密文,三者得到兩者可以計算出另外一個;在上述方法中,明文增加了自定義數據,用戶名、認證時間每個用戶都不同,所以黑客一般無法取得正常明文;我們只向客戶端通知密文,所以客戶端應不能通過密文窮舉得到明文+密鑰,所以無法破解。
4、源代碼泄露
如果服務器源代碼泄露,則可能泄露加密算法、密鑰、明文等;此時的補救方法是及時更新密鑰、調整自定義數據,所有產品都需要同時更新,明文和密鑰都發生變化,泄露代碼的風險就可以忽略了。
如果服務器架構足夠智能,則可以定時更新密鑰和自定義數據,如每個月更新一次,則整個實現體系就非常安全了;更新密鑰時切記做好兼容工作,確保更新前用戶取得的身份票據有一定的時間可以驗證成功。
5、使用範圍
上面這個方法用於自己公司的服務器之間沒有問題,但如果是要登錄其他合作夥伴的產品,則需要單獨協商加密密鑰和自定義數據即可。

出處:https://www.cnblogs.com/starksoft/p/4809362.html

C/S架構程序多種類服務器之間實現單點登錄