Cookie Session跨站無法共享問題(單點登入解決方案)

wtopps發表於2017-07-12

單點登入

什麼是單點登入,舉個例子,如果你登入了msn messenger,訪問hotmail郵件就不用在此登入。
一般單點登入都需要有一個獨立的登入站點,一般具有獨立的域名,專門的進行註冊,登入,登出等操作。
我們為了討論方便,把這個登入站點叫做站點P,設其Url為http://passport.yizhu2000.com,需要提供服務的站點設為A和B,跨站點單點登入是指你在A網站進行登入後,使用B網站的服務就不需要再登入。

從技術角度講單點登入分為:

  • 跨子域單點登入
  • 完全跨單點域登入

跨子域單點登入

所謂跨子域登入,A,B站點和P站點位於同一個域下面,比如A站點為http://blog.yizhu2000.com B站點為 http://forum.yizhu2000.com,他們和登入站點P的關係可以看到,都是屬於同一個父域,yizhu2000.com,不同的是子域不同,一個為blog,一個為forum,一個是passport。

我們先看看最常用的非跨站點普通登入的情況,一般登入驗證通過後,一般會將你的使用者名稱和一些使用者資訊,通過某一金鑰進行加密,寫在本地,也就是一個加密的cookie,我們把這個cookie叫做–票(ticket)。

需要判斷使用者是否登入的頁面,需要讀取這個ticket,並從其中解密出使用者資訊,如果ticket不存在,或者無法解密,意味著使用者沒有登入,或者登入資訊不正確,這時就要跳轉到登入頁面進行登入,在這裡加密的作用有兩個,一是防止使用者資訊被不懷好意者看到,二是保證ticket不會被偽造,後者其實更為重要,加密後,各個應用需要採用與加密同樣的金鑰進行解密,如果不知道金鑰,就不能偽造出ticket。
(注:加密和解密的金鑰有可能不同,取決於採用什麼加密演算法,如果是對稱加密,則為同一金鑰,如果是非對稱,就不同了,一般用私鑰加密,公鑰解密,但是無論怎樣,金鑰都只有內部知道,這樣偽造者既無法偽造也無法解密ticket)

跨子域的單點登入,和上述普通登入的過程沒有什麼不同,唯一不同的是寫cookie時,由於登入站點P和應用A處於不同的子域,P站寫入的cookie的域為passport.yizhu2000.net,而A站點為forum.yizhu2000.net,A在判斷使用者登入時無法讀到P站點的ticket,解決方法非常簡單,當Login完成後P站點寫ticket的時候,只需把cookie的域設為他們共同的父域,yizhu2000.net就可以了:cookie.domain=”yizhu2000.net”,A站點自然就可以讀到這個ticket了。

完全跨單點域登入

完全跨域登入,是指A,B站點和P站點沒有共同的父域,比如A站點為forum.yizhu1999.net,B站點為blog.yizhu1998.net,大家可以參考微軟旗下的幾個站點http://www.live.com,www.hotmail.com,這兩個站點就沒有共同的父域,而仍然可以共用登入,怎樣才能實現呢?請參考下圖,由於這種情況ticket比較複雜,我們暫時把P站點建立的的ticket叫做P-ticket,而A站點建立的ticket叫A-ticket,B的為B-ticket

這裡寫圖片描述

由於站點A(forum.yizhu1999.com)不能讀取到由站點P(passport.yizhu2000.com)建立的加密ticket,所以當使用者訪問A站點上需要登入才能訪問的資源時,A站點會首先檢視是否有A-ticket,如果沒有,證明使用者沒有在A站點登入過,不過並不保證使用者沒有在B站點登入,(重複一下,既然是單點登入,當然無論你在A,B任意一個站點登入過,另外一個站點都要可以訪問),請求會被重定向到p站點的驗證頁面,驗證頁面讀取P-ticket,如果沒有,或者解密不成功,就需要重定向登入頁面,登入頁面完成登入後,寫一個加密cookie,也就是P-ticket,並且重定向到A站點的登入處理頁,並把加密的使用者資訊作為引數傳遞給這個頁面,這個頁面接收登入頁的使用者資訊,解密後也要寫一個cookie,也就是A-ticket,今後使用者再次訪問A站點上需要登入許可權才能訪問的資源時,只需要檢查這個A-cookie是否存在就可以了。

當使用者訪問B站點時,會重複上面的過程,監測到沒有B-ticket,就會重定向到P站點的驗證頁面,去檢查P-ticket,如果沒有,就登入,有則返回B的登入處理頁面寫B-ticket。

登出的時候需要刪除P-ticket和A-ticket。

怎麼刪除cookie:本來以為這個不是問題,不過還是有朋友問道,簡單的說其實是建立一個和你要刪除的cookie同名的cookie,並把cookie的expire設為當前時間之前的某個時間,不過在跨子域的刪除cookie時有一點要注意:必須要把cookie的域設定為父域,在本文中為yizhu2000.com。

為了保證各個環節的傳輸的安全性,最好使用https連線。

本文轉載自:
http://www.cnblogs.com/yizhu2000/archive/2008/04/01/1131976.html

相關文章