http://www.cnblogs.com/jillzhang/archive/2008/02/01/1061212.html
先說幾句廢話,自我感覺此方案還不錯,至少解決了安全性的問題,也實現了統一登出,能跨平臺,跨服務期,跨域名,當然需要相應的聯盟站點的支持,但從原理上絕對能跨平臺。設計和具體實現的描述比較長,今天先介紹一部分
1引言
1.1 編寫目的
詳細說明單點登錄組件(SSO)的設計思想和實現方法,是日后該組件維護和擴展工作的基本依據文檔。預期讀者是要實現單點登錄(SSO)系統的系統設計人員,系統開發人員,系統維護人員。
1.2 背景
說明:
-
待開發軟件系統的名稱;jillzhang的SSO組件
-
本項目的任務提出者為jillzhang、開發者為jillzhang、用戶為有用戶整合需求平臺的開發和設計人員。
1.3 定義
SSO是Single Sign
On的縮寫,該技術主要用于用戶整合。
認證中心:認證中心是用戶注冊,成員站點管理,用戶登錄,驗證登錄信息,保存登錄
信息,頒發登錄認證的中心站點。
成員站點:
成員站點是遵從認證中心規則,享用認證中心統一用戶的站點。
注冊站點:如果想成為成員站點,必須先在認證中心進行站點登記,登記后,認證中心會保存注冊站點的配置信息,并將該配置信息發給注冊站點。注冊站點也需保存這些配置信息,供日后與認證中心交互時候使用。
聯盟用戶:指在認證中心注冊的用戶,這些用戶能被所有的成員站點所共享。
登錄請求:指成員站點向認證中心發出的帶有站點配置的用戶登錄請求信息。
登出請求:只用戶向認證中心發出的要求退出登錄的請求。
登錄請求驗證:指的是認證中心根據存儲的站點信息對成員站點的登錄請求信息進行來
源和真實性的驗證。
登出請求驗證:指認證中心在接受來自成員站點的登出請求的時候,對請求的來源和真實性進行的驗證
登錄答復:指認證中心對經過驗證的登錄請求作出的答復信息。該答復包含用戶的登錄信息。
在線聯盟用戶數:指的是在成員站點中,在線的聯盟用戶數量。
在線聯盟用戶列表:指的是在成員站點中,在線的聯盟用戶的列表信息。
登錄站點清單:是由認證中心維護的用戶的登錄站點信息,當用戶注銷的時候,會遍歷此清單,逐個登出。
1.4 參考資料
本組件的設計和實現參考了下面的系統和書籍
-
-
《數字簽名技術原理及技術》
2 程序系統的結構
本組件包括下面幾個應用接口,分別如下:
-
ISite:ISite是用于描述和操作成員站點的接口
-
IUser : IUser是用于描述和操作聯盟用戶的接口
-
IServer:IServer是認證中心處理登錄請求和登出請求的接口
-
IClient: IClient是成員站點發出登錄請求和處理登錄答復的接口
-
IUserLoginList:IUserLoginList是描述和操作用戶登錄站點清單的接口
-
ILoginRequest:是記錄和操作成員站點發送登錄請求的接口。
-
ILoginRequestContainer:用于保存和維護登錄請求列表的接口
-
IUserStateContainer:是聯盟站點中保存用聯盟用戶登錄信息的接口。
它們的定義如下:
組件的工作流程描述如下:
-
第一步,首先注冊聯盟站點,注冊聯盟站點用到接口ISite
-
第二步:注冊好聯盟站點之后,將認證中心產生的站點配置信息(包括站點編號,站點公鑰,站點私鑰,認證中心的登錄地址,認證中心登出地址)存儲到聯盟站點本地。
-
在認證中心上注冊一新用戶,注冊用戶需要使用IUser接口
-
在聯盟站點對認證中心發出登錄請求
-
認證中心驗證登錄請求
-
在認證中心進行登錄
-
登錄成功后,保存登錄票據,認證中心對聯盟站點發送登錄答復,并將此次登錄記錄到登錄站點清單
-
聯盟站點接收到登錄答復后,先進性驗證,正確后,根據登錄答復中的信息產生用戶登錄票據,并且更新聯盟用戶登錄數和登錄列表
-
在聯盟站點中發出登出請求
-
認證中心驗證登出請求,正確的話,銷毀認證中心用戶登錄票據,通過用戶的登錄站點清單,逐個調用聯盟站點的登出頁面
-
在認證中心回調聯盟站點的登出頁的時候,聯盟站點會在登出頁中銷毀各個的登錄票據,并更新在線用戶數和用戶列表。
3 ISite接口設計說明
3.1 接口描述
ISite接口包括7個屬性和2個方法,分別用于在認證中心用于描述和操作站點的配置
信息。

其中,各個屬性的含義如下
屬性名稱
|
類型
|
含義
|
SiteID
|
string
|
站點編號,用于表示站點的唯一性。
|
HomePage
|
string
|
當登錄請求中未提供來源網址項的時候,登錄答復發送的地址
|
LogOutUrl
|
string
|
在進行統一登出的時候,回調的聯盟站點頁面地址,這個頁面會負責銷毀本站的登錄票據信息。
|
PublicKey
|
string
|
用于數據交換時加密或簽名用的公鑰
|
PublicAndPrivateKey
|
string
|
用于數據交換時加密或簽名用的私鑰
|
FromUrlKey
|
string
|
用于指示聯盟站點在發送登錄請求和認證站點進行請求驗證的時候來源網址存儲位置。
|
UidField
|
string
|
用于指示聯盟站點在發送登錄請求和認證站點進行請求驗證的時候用戶信息的存儲位置。
|
還包括兩個方法,分別為:
方法名
|
含義和作用
|
Add
|
添加新的聯盟站點。
|
Validate
|
驗證聯盟對象是否已經存在
|
3.2功能
該接口能在認證中心完成新聯盟站點添加操作,添加之前可以驗證站點是否存在。
3.3 默認實現
在SSO組件中,已經實現了一個默認的ISite對象。為DefaultServer/
DefaultSite.cs,它將放置在認證中心根目錄下的sites.config文件作為存儲介質,通過Add方法添加新聯盟站點后的效果為:附件中的site.config文件,可自行下載文件后,看其結構。
4 IUser接口設計說明
4.1接口描述
IUser接口包括2個屬性和2個方法,用于在認證中心端描和操作述聯盟用戶。
其中,各個屬性的含義如下
屬性名稱
|
類型
|
含義
|
Uid
|
string
|
用戶編號,是用戶的標識
|
Pwd
|
string
|
用戶密碼
|
還包括兩個方法,分別為:
方法名
|
含義和作用
|
Validate
|
驗證用戶是否存在
|
Register
|
添加新用戶
|
4.2功能
該接口能在認證中心完成新聯用戶添加操作,添加之前可以驗證用戶是否存在。
4.3 默認實現
在SSO組件中,已經實現了一個默認的IUser對象。為DefaultServer/
DefaultUser.cs,它將放置在認證中心根目錄下的users.config文件作為存儲介質,通過Register方法添加新聯盟用戶的效果為:附件中的users.config文件,可自行下載文件后,看其結構。
5 IUserLoginList接口設計說明
5.1接口描述
IUserLoginList接口包括3個方法,用于在認證中心描述和操作用戶登錄的站點清單。
還包括三個方法,分別為:
方法名
|
含義和作用
|
Add
|
驗證用戶是否存在
|
GetLoginSites
|
獲取用戶的登錄站點清單
|
DeleteUser
|
刪除用戶的登錄站點清單數據
|
5.2功能
該接口在認證中心用于用戶記錄和維護用戶登錄的站點清單
5.3 默認實現
在SSO組件中,已經實現了一個默認的IUserLoginList對象。為DefaultServer/
UserLoginLog.cs,它通過一個Collection對象來實現用戶登錄站點清單的維護工作。
6 IServer接口設計說明
6.1接口描述
IServer接口包括2個屬性和5個方法,用于接收,驗證登錄請求,發送登錄答復,接搜,驗證登出請求,創建本地登錄票據,維護用戶登錄清單。
兩個屬性為:
屬性名稱
|
類型
|
含義
|
Site
|
ISite
|
當前上下文處理請求和答復的站點對象
|
Uid
|
string
|
當前處理的上下文中的用戶編號
|
還包括三個方法,分別為:
方法名
|
含義和作用
|
CheckUser
|
驗證用戶對象是否存在
|
CheckExistToken
|
驗證登錄票據已經存在
|
SaveToken
|
在認證中心本地保存登錄票據
|
Jump
|
通過url跳轉,發送登錄答復
|
LogOut
|
統一登出。
|
6.2功能
該接口在認證中心,用于接收,驗證登錄請求,發送登錄答復,接搜,驗證登出請求,創建本地登錄票據,維護用戶登錄清單
6.3 默認實現
在SSO組件中,已經實現了一個默認的IServer對象。為DefaultServer/
LoginRequest.cs。
7 ILoginRequest接口設計說明
7.1接口描述
ILoginRequest接口包括2個屬性,用于記錄和描述聯盟站點的登錄請求,這些信息在發出登錄請求的時候創建,在收到登錄答復的時候銷毀。用于確保登錄答復的不可復用性。
兩個屬性為:
屬性名稱
|
類型
|
含義
|
Identity
|
string
|
登錄請求標志符,該標志符會發送給服務端,服務端在發送登錄答復的時候會回傳該標志,聯盟站點會根據此標志來驗證請求是否是偽造的。
|
TimeStamp
|
DateTime
|
請求的時間戳
|
7.2功能
該接口在聯盟站點,用于記錄和描述聯盟站點的登錄請求,這些信息在發出登錄請求的時候創建,在收到登錄答復的時候銷毀。用于確保登錄答復的不可復用性。7.3
默認實現
7.3 默認實現
在SSO組件中,已經實現了一個默認的ILoginRequest對象。為DefaultServer/
LoginRequest.cs。
8 ILoginRequestContainer接口設計說明
8.1接口描述
ILoginRequestContainer接口包括3個方法,用于在聯盟站點中記錄和維護登錄請求
方法名
|
含義和作用
|
Add
|
添加登錄請求信息
|
Check
|
檢查登錄請求是否存在
|
Remove
|
銷毀存在的登錄請求
|
8.2功能
該接口在聯盟站點,用于在聯盟站點中記錄和維護登錄請求
8.3 默認實現
在SSO組件中,已經實現了一個默認的ILoginRequestContainer對象。為DefaultServer/
LoginRequestContainer.cs。
9 IUserStateContainer接口設計說明
9.1接口描述
IUserStateContainer接口包括5個方法,用于在聯盟站點中記錄和維護在線聯盟用戶信息
方法名
|
含義和作用
|
Add
|
添加登錄用戶
|
GetList
|
獲取在線用戶清單
|
Check
|
檢查某個用戶是否已經在線
|
Remove
|
移除某個在線用戶。
|
GetUserCount
|
獲取在線用戶個數
|
9.2功能
該接口在聯盟站點,用于在聯盟站點中記錄和維護在線聯盟用戶信息
9.3 默認實現
在SSO組件中,已經實現了一個默認的IUserStateContainer對象。為DefaultServer/
UserState.cs。
10 IClient接口設計說明
10.1接口描述
IClient接口包括6個屬性和2個方法,用于發出登錄請求和登出請求
8個屬性為:
屬性名稱
|
類型
|
含義
|
SiteID
|
string
|
站點編號
|
PrivateKey
|
string
|
數據交換時加密或者簽名用的公鑰
|
LoginAddress
|
string
|
認證中心登錄地址
|
LogoutAddress
|
string
|
認證中心登出地址
|
Uid
|
string
|
登錄的用戶編號
|
TimeOut
|
int
|
登錄答復的超時時間,單位s
|
UidField
|
string
|
登錄登出請求中的用戶信息的存儲位置
|
FromUrlField
|
string
|
登錄請求中的來源網址存儲位置
|
2個方法為
方法名
|
含義和作用
|
Login
|
發出登錄請求,并處理登錄答復
|
LogOut
|
登出
|
10.2功能
該接口在聯盟站點,用于發出登錄請求和登出請求
10.3 默認實現
在SSO組件中,已經實現了一個默認的IClient對象。為DefaultServer/
DefaultClient.cs
11 本系統的安全性
11.1 登錄請求的格式
聯盟站點向認證中心發送的登錄請求格式如下:
站點信息+登錄請求編號+時間戳+空用戶信息+對站點信息和登錄清秋號的簽名信息。
除了簽名信息之外的全部信息均為明文傳送,但因為重要的數據均經過數字簽名,結果是站點信息和登錄請求編號是不能被篡改的,保證了認證中心收到的登錄請求的真實性。
11.2 登錄答復的格式
認證中心發給聯盟站點的登錄答復格式如下
登錄用戶信息+登錄請求編號+時間戳+對用戶信息和登錄請求號和時間戳的簽名信息
其中登錄用戶信息是經過非對稱加密的。請求號和時間戳因為經過簽名,故也不能篡改,這樣就可以保證聯盟站點收到的登錄答復的真實性和完整性。并且非正常聯盟站點無法解密用戶信息,也無法從中獲取好處。
篇幅太大,下面還有很長的內容要說,先發布以下,感興趣的朋友可以先下載程序嘗試使用。以后,我會逐漸添加Sql 和
Oracle的實現。您也可以根據接口規范,開發符合自己系統需求的SSO系統,今天先到這吧
程序文件:/Files/jillzhang/SSO.rar
更新:新增登錄流程圖:
[原創]單點登陸(SSO)組件的設計與實現二-登錄流程圖

新增登出流程圖 2008-02-02

上面是整體流程圖,這個SSO組件在安全上有了很充分的考慮,可以說是非常安全,那么下面看看登錄請求數據的格式,和為何它能保證真實性和完整性

這樣,當數據在傳輸過程中,如果站點編號,用戶編號,請求號任意一項做任何的修改,當認證中心接收到數據之后,均無法與簽名信息進行匹配。凡是認證中心能驗證通過的請求均為合法的,真實的,完整的請求信息。
登錄答復的格式如下圖所示

因為登錄號,時間戳,用戶信息均加入數字簽名信息,所以這些數據在傳輸中不能被偽造和篡改,而用戶信息經過非對稱性加密,也防止非真正請求發送者能解析出用戶信息,這樣在接受和發送請求和響應的時候,就實現了絕對的安全。
當然不是沒有破綻,破綻在于當請求答復未到達聯盟站點之前,有人截獲并先于正常用戶登錄了聯盟站點,此時我們可以將用戶的ip信息作為答復數據的一部分,加入簽名,以此實現很高的安全保證
登出流程圖