程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 針對分析單點登錄(流程圖與數據安全)提出的問題及解決方案

針對分析單點登錄(流程圖與數據安全)提出的問題及解決方案

編輯:關於.NET

上一篇本人根據園友的文章:[原創]單點登陸(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的最佳方案.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved