上一篇本人根據園友的文章:[原創]單點登陸(SSO)組件的設計與實現,根據自己的理解進行一次總結性的分析:分析單點登錄(流程圖與數據安全).
當時根據SSO的流程做下了個人分析,也得到不少園友的評論及幫助,可是覺的可惜的是,沒有一位園友提出我畫的流程圖中存在的問題.這也可能是大家沒有看明白我的圖(本人不才).
當時自認為在流程上以及業務邏輯上都沒有太大的問題,至到有次和朋友談到了SSO,當時我非常自豪的說出了SSO的流程及思路,他也非常認可,可是他的一個問題把我難倒了.
他的問題是這樣的:
如果用戶A在聯盟站點SiteA中通過了認證中心的認可.這樣用戶A的用戶uid就會出現在認證中心中的線列表中.此時如果用戶A重新打開一個聯盟子站點SiteB,此時在聯盟站點SiteB中如何確認這個用戶的身份呢?按
理說這個用戶A在聯盟點SiteB中應該是登錄狀態.
為此再次貼出自己理解的SSO流程圖,並在圖上附上了困擾我的三個問題.
按照SSO登錄流程來看(個人理解):
首先:
判斷本站點的Session["uid"]是否存在,如果本站點的會話狀態存在則說明是登錄狀態.
問題:用session來管理子站點的會話狀態,可以有效的減少子站與聯盟站點的關聯.但是當子站點的session過期後,此時的情況有可能是這樣的,在子站點A中存在的Session沒有過期,但子站點B中的Sesion 正好過期,而用戶又沒有通過正常的退出操作,此時如何控制認證中心的在線列表呢?是存在還是不存在呢?
其次:
如果Session["uid"]不存在,則判斷網頁參數中是否有uid這個參數,如果有則通過uid到認證中心中判斷這個uid是否在認證中心的在線列表中,如果有則說明此用戶是登錄狀態.不知道這樣理解是否正確.
如果是這樣,那麼問題是這樣的:
如果用戶A登錄成功了,此時用戶B知道用戶A網頁上的參數uid,他人為的在其它子站點中的頁面中加入這人參數,此時應該也會是登錄狀態.如何解決這個問題呢?
還有一個問題就是我朋友提出的:
如果用戶A在聯盟站點SiteA中通過了認證中心的認可.這樣用戶A的用戶uid就會出現在認證中心中的線列表中.此時如果用戶A重新打開一個聯盟子站點SiteB,此時在聯盟站點SiteB中如何確認這個用戶的身份呢?不同
站點的Session是不能共享的.(如何知道是用戶A登錄而不是用戶B呢?)按理說這個用戶A在聯盟點SiteB中應該是登錄狀態.
本人分析:
1:新打開的聯盟站點是肯定不存在Session的,因為站點間Session是不能共享的.
2:新打開的聯盟站點是肯定不會存在用戶的uid的.
此時根本不能判斷用戶是否已經在認證中心中登錄過.
本文的焦點其實就在於聯盟站點如何確認用戶身份的問題.即如何確認用戶的uid.
經過本人的假想:我的解決思路是這樣的,不知道實際應用中是否可行。
用戶A在站點SiteA中登錄成功後,將用戶的UID和用戶IP以cookie的形式保存在客戶端。當用戶打開一個新的聯盟子站點(例如SiteB)時,此時的判斷用戶狀態的流程變成上圖.一般用戶的IP在一定時間內是唯一確定的,這樣做應該可以保證用戶身份的正確性與唯一性(個人是這樣認為),不知道這樣做是否正確.上面的流程圖應該可以解決我在本文中的第一幅圖中的三個問題。
本人學藝不精,一直未對SSO有正確的理解,本人憑著對SSO的熱情,希望能夠通過和各位園友的熱誠探討來分析SSO的最佳方案.