摘要:單點登錄(single sign-on)是一種解決不同系統(tǒng)之間一次登錄,多系統(tǒng)訪問的技術(shù)。設(shè)計并實現(xiàn)了一種Web環(huán)境下的單點登錄模型,以它為例,闡述了單點登錄系統(tǒng)的工作機制和流程。
關(guān)鍵詞:單點登錄;Web請求代理;URL重寫;用戶令牌
中圖分類號:TP393 文獻標(biāo)識碼:A 文章編號:1009-3044(2009)15-3937-02
Simple Analysis of Single Sign-on System
LU Jin-jiang
(Anhui Finance Trade Vocational College, Hefei 230601, China)
Abstract: Single sign-on is a technology making users access multiple systems when he logged on one point. A model for single sign-on is designed and implemented,and it is taken as an instance to illustrate how a single sign—on system works in Web applications.
Key words: single sign-on;web request-proxy;URL rewriting; user token
1 引言
隨著高校、政府、企業(yè)信息化建設(shè)的不斷發(fā)展,基礎(chǔ)設(shè)施的不斷投入與升級,基于WEB的應(yīng)用系統(tǒng)的開發(fā)也得到迅速開展。在網(wǎng)站建設(shè)的過程中,多個應(yīng)用系統(tǒng)(如辦公自動化系統(tǒng)、財務(wù)管理系統(tǒng)、人事管理系統(tǒng)、電子郵件系統(tǒng)等)一般是在不同的時期開發(fā)完成的,各應(yīng)用系統(tǒng)由于功能側(cè)重、設(shè)計方法和開發(fā)技術(shù)有所不同,也就形成了各自獨立的用戶庫和用戶認證體系。用戶在使用每個應(yīng)用系統(tǒng)之前都必須按照相應(yīng)的系統(tǒng)身份進行登錄,為此用戶必須記住每一個系統(tǒng)的用戶名和密碼,這給用戶帶來了不少麻煩。特別是隨著系統(tǒng)的增多,出錯的可能性就會增加,受到非法截獲和破壞的可能性也會增大,安全性就會相應(yīng)降低。針對于這種情況,單點登錄的概念應(yīng)運而生。
2 單點登錄概述
單點登錄(SSO,Single Sign On)是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一,是指在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次即可獲得訪問系統(tǒng)和應(yīng)用軟件的授權(quán),以后就可以訪問所有相互信任的應(yīng)用系統(tǒng),而不必多次輸入用戶名和口令來確定身份。為企業(yè)用戶提供了統(tǒng)一的信息資源認證訪問平臺,建立了統(tǒng)一的、基于角色的和個性化的信息訪問、集成平臺。
目前業(yè)界已有很多成熟的SSO方案,如IBM的WebSphere、Microsoft的.NET Passport和BEA的WebLogic,它們的實現(xiàn)方法各不相同。SSO技術(shù)的實現(xiàn)策略主要分為3種:Web請求代理、票據(jù)憑證和密碼代理。
2.1 基于Web請求代理的認證策略
這種策略的基本思想是建立統(tǒng)一的登錄服務(wù)器來代理所有的應(yīng)用系統(tǒng)的Web請求 ,用戶的認證、登錄都由這個登錄服務(wù)器統(tǒng)一處理。
2.2 基于票據(jù)憑證的認證策略
這種策略的基本思想是在登錄服務(wù)器和應(yīng)用系統(tǒng)之間通過某種憑證建立起信任關(guān)系,這種憑證稱為票據(jù)(ticket)。用戶登錄時首先要經(jīng)過統(tǒng)一登錄服務(wù)器的身份校驗,如通過校驗,可獲得一個ticket憑證。用戶擁有了ticket即可無需任何附加憑證對服務(wù)器所轄所有應(yīng)用系統(tǒng)進行訪問。
2.3 基于密碼代理的認證策略
這種策略是在結(jié)合前兩種策略的基礎(chǔ)上演化而來的。用戶在登錄服務(wù)器上完成統(tǒng)一登錄后,進入應(yīng)用系統(tǒng)時再由登錄服務(wù)器根據(jù)用戶信息獲取相應(yīng)密碼自動完成二次登錄。
其中基于Web請求代理的策略是最理想、應(yīng)用最為廣泛的實現(xiàn)思想。下面就利用這種策略來模擬一個簡單的SSO系統(tǒng)。
3 系統(tǒng)設(shè)計思想
本系統(tǒng)在ASP.NET平臺下使用C#開發(fā),包含2類網(wǎng)站:各Web應(yīng)用網(wǎng)站和登錄服務(wù)器網(wǎng)站。主要功能模塊分為登錄模塊、登錄驗證模塊和退出模塊。其中登錄模塊設(shè)置在各Web應(yīng)用網(wǎng)站,登錄驗證模塊設(shè)置在登錄服務(wù)器網(wǎng)站,各Web應(yīng)用網(wǎng)站和登錄服務(wù)器網(wǎng)站均設(shè)有退出模塊。系統(tǒng)主要流程如下:
3.1 登錄流程
1) 用戶訪問網(wǎng)站A,在本地Session中寫入信息標(biāo)示用戶已經(jīng)登錄。
2) 轉(zhuǎn)向登錄服務(wù)器記錄登錄信息,通過URL傳遞給登錄服務(wù)器網(wǎng)站名、網(wǎng)站退出頁面地址和當(dāng)前的URL。
3) 在登錄服務(wù)器初始化一個字典,存儲傳遞過來的網(wǎng)站A網(wǎng)站名和網(wǎng)站退出頁面地址,并把這個字典加入登錄服務(wù)器的Session中。
4) 重定向到網(wǎng)站A登錄頁面,本地Session中已有用戶信息,表明已經(jīng)登錄。
3.2 站點間的跨域跳轉(zhuǎn)流程
1) 用戶登錄訪問網(wǎng)站A后,向網(wǎng)站B發(fā)出登錄請求,站點檢查本地Session中有無用戶信息,如有則直接進入。
2) 否則說明用戶首次訪問網(wǎng)站B,頁面重定向登錄服務(wù)器檢查Session,并通過URL傳遞給登錄服務(wù)器網(wǎng)站名、網(wǎng)站退出頁面地址和當(dāng)前的URL。
3) 登錄服務(wù)器Session不為空,記錄網(wǎng)站B網(wǎng)站名和退出頁面地址。
4) 登錄服務(wù)器將請求轉(zhuǎn)回網(wǎng)站B,并返回一個標(biāo)示符,表示已經(jīng)登錄過。
5) 網(wǎng)站B接收到驗證通過標(biāo)示,在本地Session中寫入登錄信息。
3.3 退出流程
1) 用戶在網(wǎng)站A(或網(wǎng)站B)進行退出操作,發(fā)出退出請求。
2) 直接重定向到登錄服務(wù)器的退出頁面,在URL中傳遞請求頁面URL地址。
3) 登錄服務(wù)器遍歷Session中存儲的字典,得到該用戶所有已登錄的網(wǎng)站名和網(wǎng)站退出地址。
4) 登錄服務(wù)器將退出請求轉(zhuǎn)向各網(wǎng)站的退出頁面,并清空Session。
5) 各網(wǎng)站的退出頁面進行清空本地Session操作。
6) 登錄服務(wù)器返回網(wǎng)站A(或網(wǎng)站B)的登錄頁面。
4 系統(tǒng)實現(xiàn)要點
1) 在ASP.NET解決方案中只創(chuàng)建兩個網(wǎng)站項目:LoginClient和LoginServer,LoginClient為Web應(yīng)用站點,LoginServer為登錄管理站點。在部署站點時,把LoginClient部署到多個目錄LoginClient1、LoginClient2、…、LoginClient n,來模擬多個站點。
2) 在LoginClient的web.config文件appSetting節(jié)點中中設(shè)置網(wǎng)站信息,以便統(tǒng)一管理。
3) 使用URL重寫方案實現(xiàn)用戶信息在多個應(yīng)用站點間的跨域傳遞,保證系統(tǒng)下的各個應(yīng)用站點間實現(xiàn)用戶狀態(tài)信息的共享。關(guān)鍵代碼如下:
Response.Redirect(ConfigurationManager.AppSettings[\"LoginServerURL\"]+\"/Login.aspx?WebSiteName=\"+ConfigurationManager.AppSettings[\"WebSiteName\"]+ \"WebSiteLogoutURL=\"+ConfigurationManager.AppSettings[\"WebSiteLogoutURL\"]+\"url=\"+ConfigurationManager.AppSettings[\"WebSiteLoginURL\"]+ \"action=LoginUserName=\"+Session[\"UserName\"]+\"Token=\"+ TokenHelper.GetToken(Session[\"UserName\"].ToString()));
4) 為了防止用戶在請求URL時手動添加偽造用戶信息來欺騙應(yīng)用站點,實現(xiàn)非法登錄,在URL中不僅傳遞用戶信息,還要附帶傳遞一個令牌參數(shù)——一個事先寫入數(shù)據(jù)庫的GUID值。接收到令牌參數(shù)后到數(shù)據(jù)庫進行驗證,如通過驗證,立即生成另一個GUID再寫入數(shù)據(jù)庫,上一個令牌失效。關(guān)鍵代碼如下:
string sNewToken = Guid.NewGuid().ToString();
bool bReturn = 1;
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings[\"SSOConnString\"]))
{ conn.Open();
SqlCommand cmd1 = new SqlCommand(\"SELECT count(*) FROM tbUser WHERE UserName=@UserName and Token=@Token\", conn);
cmd1.Parameters.AddWithValue(\"@UserName\", sUserName);
cmd1.Parameters.AddWithValue(\"@Token\", sToken);
bReturn = cmd1.ExecuteScalar().ToString() == \"1\";
SqlCommand cmd2 = new SqlCommand(\"UPDATE tbUser SET Token=@Token WHERE UserName=@UserName\", conn);
cmd2.Parameters.AddWithValue(\"@UserName\", sUserName);
cmd2.Parameters.AddWithValue(\"@Token\", sNewToken);
cmd2.ExecuteNonQuery();
}
5) 在退出模塊,登錄服務(wù)器輸出圖片流,利用img的src來訪問各個網(wǎng)站的退出頁面進行退出操作。關(guān)鍵代碼如下:
foreach (string s in LoginWebSite.Keys)
{string WebSiteName = s;
string WebSiteLogoutURL = LoginWebSite[s] + \"?tmp=\" + Guid.NewGuid();
Response.Write(String.Format(\"{0}:<img src='{1}'/><br/>\", WebSiteName, WebSiteLogoutURL));
}
5 結(jié)束語
通過實現(xiàn)單點登錄,用戶可以得到更多的收益,更簡單的使用和更合理的管理。以上只是對SSO系統(tǒng)的簡單模擬,實際應(yīng)用中,還會和PKI證書、XML標(biāo)準(zhǔn)以及Web Service安全規(guī)范標(biāo)準(zhǔn)等技術(shù)相結(jié)合,形成更加安全、可行的解決方案。
參考文獻:
[1] 陳重威.一個Web應(yīng)用單點登錄系統(tǒng)的設(shè)計和實現(xiàn)[J].哈爾濱師范大學(xué)自然科學(xué)學(xué)報,2004,20(1).
[2] 皮曉東.單點登錄的研究與實現(xiàn)[J].計算機應(yīng)用與軟件,2007,24(6).
[3] 由雪梅,李大興.基于PKI的Web單點登錄系統(tǒng)設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2007,28(9).
[4] 陳淥漪,管小清.單點登錄(SSO)系統(tǒng)的設(shè)計與實現(xiàn)[J].電腦知識與技術(shù),2008,3(7).
[5] 張慶華.ASP.NET完全自學(xué)手冊[M].北京:機械工業(yè)出版社,2007.
[6] 陳鵬,刁紅軍,朱斐.一種基于Web單點登錄系統(tǒng)實現(xiàn)[J].計算機應(yīng)用與軟件,2007,24(11).
[7] 奚江華.圣殿祭司的ASP.NET2.0開發(fā)詳解[M].北京:電子工業(yè)出版社,2008.
[8] 德仔工作室.單點登陸系統(tǒng)SSO原理[EB/OL].http://www.dezai.cn/article_show.asp?ArticleID=13742.