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

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

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

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

這樣,當(dāng)數(shù)據(jù)在傳輸過(guò)程中,如果站點(diǎn)編號(hào),用戶編號(hào),請(qǐng)求號(hào)任意一項(xiàng)做任何的修改,當(dāng)認(rèn)證中心接收到數(shù)據(jù)之后,均無(wú)法與簽名信息進(jìn)行匹配。凡是認(rèn)證中心能驗(yàn)證通過(guò)的請(qǐng)求均為合法的,真實(shí)的,完整的請(qǐng)求信息。
登錄答復(fù)的格式如下圖所示

因?yàn)榈卿浱?hào),時(shí)間戳,用戶信息均加入數(shù)字簽名信息,所以這些數(shù)據(jù)在傳輸中不能被偽造和篡改,而用戶信息經(jīng)過(guò)非對(duì)稱性加密,也防止非真正請(qǐng)求發(fā)送者能解析出用戶信息,這樣在接受和發(fā)送請(qǐng)求和響應(yīng)的時(shí)候,就實(shí)現(xiàn)了絕對(duì)的安全。
當(dāng)然不是沒(méi)有破綻,破綻在于當(dāng)請(qǐng)求答復(fù)未到達(dá)聯(lián)盟站點(diǎn)之前,有人截獲并先于正常用戶登錄了聯(lián)盟站點(diǎn),此時(shí)我們可以將用戶的ip信息作為答復(fù)數(shù)據(jù)的一部分,加入簽名,以此實(shí)現(xiàn)很高的安全保證
登出流程圖