單點登陸解決方案一

 

更新:新增登錄流程圖:

[原創]單點登陸(SSO)組件的設計與實現二-登錄流程圖 


    先說幾句廢話,自我感覺此方案還不錯,至少解決了安全性的問題,也實現了統一登出,能跨平臺,跨服務期,跨域名,當然需要相應的聯盟站點的支持,但從原理上絕對能跨平臺。設計和具體實現的描述比較長,今天先介紹一部分


1引言

1.1 編寫目的

詳細說明單點登錄組件(SSO)的設計思想和實現方法,是日後該組件維護和擴展工作的基本依據文檔。預期讀者是要實現單點登錄(SSO)系統的系統設計人員,系統開發人員,系統維護人員。

1.2 背景

說明:

  1. 待開發軟件系統的名稱;jillzhang的SSO組件
  2. 本項目的任務提出者爲jillzhang、開發者爲jillzhang、用戶爲有用戶整合需求平臺的開發和設計人員。

1.3 定義

SSO是Single Sign On的縮寫,該技術主要用於用戶整合。
認證中心:認證中心是用戶註冊,成員站點管理,用戶登錄,驗證登錄信息,保存登錄 信息,頒發登錄認證的中心站點。 
成員站點: 成員站點是遵從認證中心規則,享用認證中心統一用戶的站點。  
註冊站點:如果想成爲成員站點,必須先在認證中心進行站點登記,登記後,認證中心會保存註冊站點的配置信息,並將該配置信息發給註冊站點。註冊站點也需保存這些配置信息,供日後與認證中心交互時候使用。  
聯盟用戶:指在認證中心註冊的用戶,這些用戶能被所有的成員站點所共享。
登錄請求:指成員站點向認證中心發出的帶有站點配置的用戶登錄請求信息。
登出請求:只用戶向認證中心發出的要求退出登錄的請求。  
登錄請求驗證:指的是認證中心根據存儲的站點信息對成員站點的登錄請求信息進行來 源和真實性的驗證。
登出請求驗證:指認證中心在接受來自成員站點的登出請求的時候,對請求的來源和真實性進行的驗證
登錄答覆:指認證中心對經過驗證的登錄請求作出的答覆信息。該答覆包含用戶的登錄信息。
在線聯盟用戶數:指的是在成員站點中,在線的聯盟用戶數量。  
在線聯盟用戶列表:指的是在成員站點中,在線的聯盟用戶的列表信息。 
登錄站點清單:是由認證中心維護的用戶的登錄站點信息,當用戶註銷的時候,會遍歷此清單,逐個登出。

1.4 參考資料

本組件的設計和實現參考了下面的系統和書籍

  1. 《數字簽名技術原理及技術》

2 程序系統的結構

本組件包括下面幾個應用接口,分別如下:

  1. ISite:ISite是用於描述和操作成員站點的接口
  2. IUser : IUser是用於描述和操作聯盟用戶的接口
  3. IServer:IServer是認證中心處理登錄請求和登出請求的接口
  4. IClient: IClient是成員站點發出登錄請求和處理登錄答覆的接口
  5. IUserLoginList:IUserLoginList是描述和操作用戶登錄站點清單的接口
  6. ILoginRequest:是記錄和操作成員站點發送登錄請求的接口。
  7. ILoginRequestContainer:用於保存和維護登錄請求列表的接口
  8. IUserStateContainer:是聯盟站點中保存用聯盟用戶登錄信息的接口。

它們的定義如下:

組件的工作流程描述如下:

  1. 第一步,首先註冊聯盟站點,註冊聯盟站點用到接口ISite
  2. 第二步:註冊好聯盟站點之後,將認證中心產生的站點配置信息(包括站點編號,站點公鑰,站點私鑰,認證中心的登錄地址,認證中心登出地址)存儲到聯盟站點本地。
  3. 在認證中心上註冊一新用戶,註冊用戶需要使用IUser接口
  4. 在聯盟站點對認證中心發出登錄請求
  5. 認證中心驗證登錄請求
  6. 在認證中心進行登錄
  7. 登錄成功後,保存登錄票據,認證中心對聯盟站點發送登錄答覆,並將此次登錄記錄到登錄站點清單
  8. 聯盟站點接收到登錄答覆後,先進性驗證,正確後,根據登錄答覆中的信息產生用戶登錄票據,並且更新聯盟用戶登錄數和登錄列表
  9. 在聯盟站點中發出登出請求
  10. 認證中心驗證登出請求,正確的話,銷燬認證中心用戶登錄票據,通過用戶的登錄站點清單,逐個調用聯盟站點的登出頁面
  11. 在認證中心回調聯盟站點的登出頁的時候,聯盟站點會在登出頁中銷燬各個的登錄票據,並更新在線用戶數和用戶列表。

 

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系統,今天先到這吧

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章