也談SSO,一個簡單實用的單點登陸Demo

關於SSO(單點登陸),百度百科解釋以下 :web

  「SSO英文全稱Single Sign On,單點登陸。SSO是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。它包括能夠將此次主要的登陸映射到其餘應用中用於同一個用戶的登陸的機制。它是目前比較流行的企業業務整合的解決方案之一。數據庫

  要實現SSO的功能,讓用戶只登陸一次,就必須讓應用系統可以識別已經登陸過的用戶。應用系統應該能對ticket進行識別和提取,經過與認證系統的通信,能自動判斷當前用戶是否登陸過,從而完成單點登陸的功能。
  單一的用戶信息數據庫並非必須的,有許多系統不能將全部的用戶信息都集中存儲,應該容許用戶信息放置在不一樣的存儲中,事實上,只要統一認證系統,統一ticket的產生和校驗,不管用戶信息存儲在什麼地方,都能實現單點登陸。
  統一的認證系統並非說只有單個的認證服務器。」
  總結出幾個要素:
    1. 多個應用系統 (本文中侷限於專屬web類B/S信息業務系統)。    --    針對的現實業務場景
    2. 只需成功登陸一次(能夠在應用系統各自的登陸界面登陸,亦可在統一認證服務器登陸界面登陸)。  --   要達到的目的:簡單、易用、人性化
    3. 認證服務器集中統一發放票據ticket。   --   關鍵流程1:發票
    4. 各個業務系統對ticket提取、認證服務器再識別、信任互訪。   --   關鍵流程2:認票
    5. 並不是必須將全部的用戶信息集中存儲處理於單一的用戶信息數據庫。  --  非必要前提
    6. 多個應用系統中的不一樣帳戶統一映射集中於認證服務器。   --    技術實現的關鍵前提
 
  設計開發這個Demo的基本原則:花最小的改造代價實現新、老web信息業務系統融入到SSO大系統中,成爲SSO大系統下的各類大、小B/S業務子系統、子站點的聚合,用戶使用SSO大系統裏的各項web業務子系統功能時,只需登陸認證成功一次,就能夠在SSO大系統下的子系統間,無縫跳轉、自由切換遊弋。作到改造代價最小、安全、高效、便捷、易使用、易擴展。
 
  若是面對的業務場景是這樣的,某組織或者集團前後上馬投入運營了不一樣公司採用不一樣技術(本文狹義上指:asp、asp.net、PHP、JSP)開發的各樣B/S的業務信息系統,每一個系統有本身的用戶登陸模塊和權限分配管理控制模型,後來又準備上馬的新業務系統打算集中用戶與權限控制管理於統一的數據庫,固然仍能夠各自爲政,各搞各的用戶與權限管理。若是有條件對各個業務信息系統作小許的變更(代碼級的調整變更)以實現SSO,本文案例Demo能夠提供一些參考。
  
 
 
Demo文件目錄結構以下:
  • SSODemo
  1. DB(SQLServer數據庫備份)
    1. SSOServerDemo.bak   -- 認證服務器演示數據庫:用戶表、UserID映射表、帳戶登陸記錄表
    2. testSSOSite1.bak        -- 站點1的演示數據庫:用戶表
    3. testSSOSite2.bak        -- 站點2的演示數據庫:用戶表
  2. SSOServerDemo(統一認證服務器)
    1. Login.aspx                  -- 認證服務器,集中統一登陸界面,站點New跳轉此,使用此界面登陸
    2. UserMapping.aspx       -- 將站點一、二、New的帳號統一映射,成功後存入SSOServer數據庫UserID映射表
    3. addNewSiteUser.aspx  -- 將後續新站點的新帳號加入統一映射,成功後存入SSOServer數據庫UserID映射表
    4. InvalidUserId.aspx      -- 失效某站點中的某帳號
    5. authorizationCookie.aspx -- 發放統一認證票據
    6. httpGetCookie.aspx         -- 獲取SSOServer域下的認證Cookie票據
    7. pollingSession.aspx         -- 刷新Session會話
    8. pollingSession.asmx        -- 刷新在線用戶狀態數據
    9. abandonSession.aspx      -- 更新在線用戶會話狀態表記錄,刪除會話票據
    10. GetUserIdByRecordID.aspx -- 驗證票據,成功後,返回站點用戶對應的UserID
    11. checkUserID.asmx -- 驗證UserID是否被篡改過
    12. SSOSitesXML.config -- SSO中各個站點的IP及端口配置
  3. testSSOApplication1(表明舊有的B/S信息系統1)
    1. login.aspx
    2. PageBase.cs
    3. verifyUser.asmx  -- 驗證用戶名、密碼經過後,返回該帳號對應UserID
    4. pollingSession.ashx -- 刷新用戶會話狀態
    5. GetCookie.aspx -- 跨域取Cookie票據,送往SSOServer,驗證經過後,返回用戶在該站點的UserID,產生Session["userId"]
    6. abandonSession.aspx -- 刪除Cookie票據和Session
    7. ClearSession.aspx -- 清除Session
    8. getEncryptPWD.aspx -- 獲取某帳號在該站點對應的加密後的密碼字符串內容
    9. getSSOServerIP.ashx -- 獲取SSOServerIP
    10. getRemoteCookie.js、pollingSession.js、abandonSession.js -- 相關的關鍵JS文件
  4. testSSOApplication2(表明舊有的B/S信息系統2)
    1. login.aspx
    2. PageBase.cs
    3. verifyUser.asmx
    4. pollingSession.ashx
    5. GetCookie.aspx
    6. abandonSession.aspx
    7. ClearSession.aspx
    8. getEncryptPWD.aspx
    9. getSSOServerIP.ashx
    10. getRemoteCookie.js、pollingSession.js、abandonSession.js
  5. testSSOApplicationNew(表明新上的B/S信息系統New)
    1. PageBase.cs
    2. pollingSession.ashx
    3. GetCookie.aspx
    4. abandonSession.aspx
    5. ClearSession.aspx 
    6. getSSOServerIP.ashx
    7. getRemoteCookie.js、pollingSession.js、abandonSession.js
  
 
  測試前的先期工做,首先到SSOServer的UserMapping.aspx頁面,創建各站點帳號的統一映射。本Demo中,Site1爲帳號:site1 密碼:site1,Site2爲帳號:site2 密碼:site2,SiteNew爲帳號:siteNew 密碼:siteNew。如有新站點新帳號加入SSO,請到SSOServer的addNewSiteUser.aspx選擇相應站點加入新帳號進行映射。SSOServerDemo.bak的UserID映射表已存在測試帳號的映射記錄,各位看官測試時, 沒必要再次映射。 
 
   注意:測試前請先修改站點的IP配置,各個站點項目中都靜態引用了一些web服務,請配置好各個站點的IP及端口後,在VS中更新引用這些web服務。各個站點的IP配置信息在SSOSitesXML.config、appSettings.config、Web.config這幾個文件中。
  
  
  
 
  對於 Site1Site2的流程以下:
    PageBase.cs會檢查 IF Session["userId"] == null,Redirect至GetCookie.aspx,JS跨域請求SSOServer下的httpGetCookie.aspx 獲取Cookie認證票據內容,GetCookie.aspx服務器端代碼 IF 發現獲取的Cookie字符串內容爲空,跳轉至login.aspx。IF 獲取的Cookie字符串內容不爲空,將Cookie票據字符串內容發送至SSOServer WEB服務GetUserIdByRecordID.asmx,驗證票據成功後,Web服務返回UserID,產生Session["userId"] = userID,根據UserID在該站點數據庫中取得該用戶在該站點的權限列表集合。
  
    若跳至login.aspx,根據用戶輸入的用戶名、密碼, 查詢該站點的用戶數據庫,驗證經過後,產生Session["userId"] = userId,根據UserID在該站點數據庫中取得該用戶在該站點的權限列表集合。同時Respons.Write JS腳本至客戶端,腳本發起請求SSOServer的authorizationCookie.aspx發放統一認證票據。
 
  對於 SiteNew的流程以下:
    PageBase.cs會檢查 IF Session["userId"] == null,Redirect至GetCookie.aspx,JS跨域請求SSOServer下的httpGetCookie.aspx 獲取Cookie認證票據內容,GetCookie.aspx服務器端代碼 IF 發現獲取的Cookie字符串內容爲空,跳轉至 SSOServer下login.aspx。IF 獲取的Cookie字符串內容不爲空,將Cookie票據字符串內容發送至SSOServer WEB服務GetUserIdByRecordID.asmx,驗證票據成功後,Web服務返回UserID,產生Session["userId"] = userID,根據UserID取得該用戶在該站點的權限列表集合。
  
    若跳至 SSOServer下login.aspx,根據用戶輸入的用戶名、密碼, 查詢SSOServer的用戶數據庫,驗證經過後,產生Session["userId"] = userId,根據UserID取得該用戶在該站點的權限列表集合。同時Respons.Write JS腳本至客戶端,腳本發起請求SSOServer下的authorizationCookie.aspx發放統一認證票據。
 
至於詳細細節實現,代碼都很簡單。請列位看倌,下載Demo代碼後,本身翻閱查看 ... ...
 
 
問題一:如何作到B/S、C/S系統的混合型信息業務系統的單點登陸、統一認證?
 
問題二:如何作到SSO大系統下的B/S、C/S信息業務子系統不作任何代碼級修改或者架構設計上的改造而實現問題一?
請網友們各抒己見,提供參考意見和思路、提示 ... ...
若是有什麼請聯繫我,QQ:908460320。
相關文章
相關標籤/搜索