這是一個老話題了,當前各門戶一般也都實現了多個業務之間的單點登入。下面根據我經曆過的項目,談一下我自己的看法。
為什麼需要單點登入:
產品剛上線時,一般由於使用者量少,所有的功能都放在一起,一般也不需要具體的單點登入。隨著使用者量和業務發展的需要,要求逐步將產品按功能或效能分為相應獨立的網站,並分開部署,這就需要在各個網站之間進行單點登入,以達到使用者一次登入,就可以使用多個網站。
單點登入的實現:
簡單方法: 在同一個域內的網站,可以簡單的通過共用Cookie(將登入使用者名稱存放Cookie中)來實現單點登入。這種方法實現簡單,安全性方法可以通過將Cookie值加密方式加強,但對不同域下及不同開發語言下(如A網站C#,B網站C)實現麻煩。
推薦方法:建立統一的認證中心,認證中心提供:
1、使用者登入認證(認證使用者名稱和密碼),如果成功,返回表示本次登入的登入Token
2、登入Token認證(認證Token是否正確),如果成功,返回當前登入的使用者名稱
3、延長Token有效期間
4、退出(使Token失效)
認證中心獨立於各個網站,單點流程一般情境如下:
1、使用者在網站A輸入使用者名稱和密碼點擊登入
2、網站A將使用者名稱和密碼轉寄給認證中心進行認證,認證中心返回Token
3、網站A將當前登入使用者和Token存入Session(或Cookie)
4、在網站A上點擊串連訪問網站B,通過URL參數方式,將Token帶給網站B
5、網站B將Token轉交到認證中心,認證正確,返回目前使用者名。
6、網站B將當前登入使用者和Token存入Session(或Cookie),完成登入流程
這樣的設計下的Token,還可以用在非同步使用Ajax去訪問伺服器端的介面(介面可能獨立部署在不同的網站下),這樣只需要帶上Token,伺服器端的介面認證Token通過後,直接返回這個登入使用者的相應使用者資訊。
安全性考慮:
1、使用者登入認證介面,可增加認證頻率、認證IP等限制,防止暴力密碼破解攻擊
2、Token其實就是一串表示本次登入的唯一字串,可以產生字串時,增加摘要資訊。如Token的組成為:A+MD5(A+PWD) 的方式,A為隨機產生的GUID,這樣在驗證Token時,就可以直接通過演算法來驗證合法性,只有演算法驗證通過後,再進行下一步的操作。
以上只是從整體上描述統一認證的設計,中間還有很多細節沒有描述出來,需要瞭解的我們可進一步討論。
下一篇,準備寫一下認證中心內部,如何?分布式認證系統,支援高並發、防攻擊等方面內容。
------------------------
轉寄請保留出處。謝謝