杜歆文
(蘇州廣播電視總臺 技術中心,江蘇 蘇州 215006)
單點登錄系統的設計與實現
杜歆文
(蘇州廣播電視總臺 技術中心,江蘇 蘇州 215006)
研究了單點登錄系統的設計與實現,利用每人唯一的賬號和密碼實現多個系統的登錄認證。討論了兩種單點登錄實現方式,一種為主站通過非對稱加密算法的私鑰生成憑證,分站認證登錄,另一種方式為主站模擬用戶登錄行為,采用POST參數的方式登錄分站。兩種實現方式各有利弊,適合不同情況。該系統對用戶使用感受、系統安全性有較好影響。
單點登錄;非對稱加密;授權;參數傳遞;跨域
【本文獻信息】杜歆文.單點登錄系統的設計與實現[J].電視技術,2013,37(24).
隨著信息化的發展和全臺網的建設,越來越多的工作依賴網絡、計算機,工作人員需要記憶大量的用戶名、密碼,每天上班打開計算機登錄域,寫稿件,查詢媒資,收發郵件……每一項工作都需要輸入用戶名、密碼。由于系統開發使用時間不同,造成了用戶名不統一,有的使用拼音縮寫,有的使用中文名,還有的使用昵稱登錄;用戶為了使用方便,有的使用簡單密碼登錄,有的被強制設置為復雜密碼,造成用戶的困惑。因此需要簡化登錄過程,統一用戶名和密碼。
目前蘇州臺采用Windows域管理用戶和計算機,用戶必須擁有一個域賬號才能登錄計算機,接入網絡。因此,考慮把該賬號作為用戶統一且唯一的身份認證信息。
由于Web系統的便利性,以及越來越完善的功能,近年來,絕大多數應用系統都采用了B/S架構,因此,本文主要考慮Web系統的用戶管理、登錄問題。
將現有系統分成兩大類:一類系統是由臺內自行開發研制,比如固定資產管理、技術客服系統等;還有一類是由第三方廠商進行開發部署,比如媒資、文稿、郵箱等。對于前者,可以對登錄模塊進行修改,以適應單點登錄模塊的需求,同時,在以后開發的系統中,可以省略登錄模塊,依靠單點登錄系統對用戶進行管理。對于后一類系統,無法進行定制開發,也沒辦法做任何修改,只能去適應現有系統,依賴各系統原有的登錄模塊來實現單點登錄。考慮到用戶習慣的延續和系統切割的平滑,計劃保留原有各系統登錄模塊,用戶可以完全保持原有習慣,再逐步向單點登錄引導。
為了方便描述,先約定幾個概念:1)總站,也可稱為主站、中心站點,單點登錄系統中驗證用戶登錄,并向分站跳轉;2)分站,也可稱子系統,原有的業務系統需要接入單點登錄;3)憑證,英文token,子系統以此識別授權用戶。
原登錄過程為用戶打開所需登錄系統首頁,輸入用戶名、密碼,登錄系統。現在考慮以下登錄過程:用戶訪問未授權頁面時被轉向到總站登錄頁,或者用戶直接打開該登錄頁,輸入用戶名、密碼,自動判斷或手動選擇需要登錄的子系統,主站驗證通過后發送憑證給分站,并轉向分站驗證通過后允許用戶登錄。
該登錄過程對于自行開發的網站只需要稍作修改即可實現,整個過程符合用戶使用習慣,并能夠保證安全可靠。但需要考慮兩個問題:
1)對于以后開發的站點,是延續以前的方式擁有獨立的登錄模塊,還是可以省略,完全依賴單點登錄。筆者認為分站是可以完全信任主站的,對于主站傳到分站的憑證,如果可以完全證實用戶身份的話,分站將允許用戶登錄。在這種情況下,分站可以省略用戶登錄驗證過程,完全依賴單點登錄系統。但是由于各系統的功能不同,子系統還需要自己的權限管理。
2)面對不可修改的分站,要想實現這種登錄過程就一籌莫展了。為了使用戶體驗統一,同樣輸入用戶名、密碼,選擇登錄子系統后,總站模擬用戶行為,去分站提交對應的用戶名、密碼,完成登錄后,總站轉向分站登錄后頁面。對于用戶來說,需要做的只是輸入必需信息,體驗完全一樣。
該系統數據結構簡單,主要需要保存兩類數據,一種是用戶信息,記錄總站用戶名和分站用戶名的對應關系;還有一種是站點信息,記錄分站的地址、登錄頁、登錄方式等信息。
2.3.1 主站登錄頁
主站登錄頁用于接收用戶的輸入,包括用戶名、密碼、選擇登錄分站,當用戶允許保存cookie時,在用戶本地保存加密后的用戶名。用戶訪問主站登錄頁,頁面檢測到cookie,并提交給服務器,服務器對cookie信息進行檢查、解密,確認用戶信息完整后提供快速登錄功能,用戶只需要選擇登錄分站名稱,而不需要重復輸入用戶名、密碼,可以直接訪問分站。
2.3.2 可修改的站點登錄
總站將憑證傳給分站,分站驗證憑證后允許登錄,在這個過程中關鍵問題在于建立憑證,能夠保證憑證的安全性,使分站能夠完全信任。
此處需要用到非對稱加密算法。通常接觸較多的是對稱加密算法:發送方將需要發送的明文信息使用密鑰,通過一系列運算產生密文發送,接收方收到密文后使用同樣的密鑰通過運算還原出明文,所謂對稱,就是指采用這種方式,使加、解密雙方的密鑰是相同的。
對于非對稱算法,顯而易見,即加密、解密過程中的密鑰不同。非對稱加密算法又稱公開密鑰加密算法,該算法需要兩個密鑰——公開密鑰和私有密鑰,這兩個密鑰是一對。如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那么只有用對應的公開密鑰才能解密。甲方生成一對密鑰并將其中的一把作為公用密鑰向其他方公開,得到該公用密鑰的乙方使用該密鑰對機密信息進行加密后再發送給甲方,甲方再用自己保存的另一把專用密鑰對加密后的信息進行解密。除了傳輸數據,非對稱密鑰還用來進行數字簽名:發送方A對發送的報文M生成一個摘要X1并用自己的私鑰加密這個摘要X1,接收方B對使用A的公鑰解開這個加密摘要,得到X1并對比接收到的報文M重新生成的摘要X2,如果一樣,說明報文M在傳遞過程沒有被修改,的確是A發送的[1]。
在本系統中采用了常用的非對稱加密算法——RSA,并對非對稱加密算法兩種常規的使用方法稍作修改,使其更符合本系統的應用。
對于每個分站,需要建立一對密鑰——一個公鑰和一個私鑰。私鑰由主站妥善保管,公鑰對分站公開。主站登錄頁驗證用戶登錄后,根據用戶選擇分站查找該分站對應用戶名,如果不存在,則轉向一個頁面,要求用戶輸入需要登錄分站的用戶名、密碼,將這一過程稱之為授權。授權頁去分站數據庫驗證用戶名和密碼,驗證通過后將主站用戶名和分站用戶名建立對應關系并保存,授權過程只有第一次登錄分站時需要進行,目的是建立兩個站點用戶名之間的對應關系,密碼不需要保存。授權成功后主站對分站用戶名用對應私鑰進行加密,并將加密后的結果傳遞給分站,分站用自己的公鑰解密,正確解密將得到需要登錄的分站用戶名。
通常情況,如果篡改加密后密文是無法正常解密的,但不排除特殊情況,因此加入校驗機制(此處使用最簡單的長度校驗),將用戶名和校驗碼一起使用私鑰加密,分站使用公鑰解密后檢查用戶名和校驗碼,符合則認為解密成功。在傳輸過程中,還需要防止惡意攻擊,如果主站、分站以外的第三者截取到加密信息,不需要輸入密碼就可以登錄系統。因此,在用戶名、校驗碼之外,再加上時間戳,這三個信息一起加密傳輸,分站得到信息解密,先檢查校驗碼,判斷是否正確解密,確認密鑰的正確性,再檢查時間戳,超過有效時間則認為該信息無效,不允許登錄。這樣即使加密信息被截取重放,由于超過了有效時間,也無法正常登錄系統。
2.3.3 不可修改的站點登錄
該類站點登錄,需要主站模擬用戶登錄行為,達到單點登錄的目的。
如前所述,這里同樣需要“授權”這一過程建立主站用戶名和分站用戶名的關聯。不同的是對于一些數據庫加密保存密碼的系統,主站還需要保存用戶的明文密碼。
表單(form)有兩種方法GET和POST把數據提交給服務器。GET請求的數據會附在URL之后,以“?”分割URL和傳輸數據,參數之間以“&”相連,如login.aspx?name=xxx&password=yyy。POST則是把提交的數據放置在HTTP包的包體中。絕大多數登錄頁面都是通過POST方式把相關參數提交到后臺進行驗證。因此,需要程序模擬這個POST的過程登錄。
在JavaScript中,有一個很重要的安全性限制,被稱為同源策略(Same-Origin Policy),即JavaScript只能訪問與它的文檔在同一域下的內容。比如www.a.com站點下的頁面元素或腳本和www.b.com站點是無法互相訪問的。顯然,總站和分站并不能保證都在同一個域名下,因此,這里產生了一個跨域POST的問題,解決方法有一些,本系統中使用的是一種比較簡單的方法:在分站的網站主目錄下放置一個靜態頁面,取名為SSOLogin.htm,中心站點將用戶名、密碼、登錄頁地址通過GET方式傳遞給這個 頁 面 ,如 SSOLogin.htm?username=aaa&password=bbb&posturl=ccc,該頁面得到參數信息后,按約定格式將用戶名、密碼等必需信息POST到登錄頁,登錄成功后轉向登錄后頁面。由于SSOLogin.htm是純靜態頁面,不需要服務器交互,可以做到與分站服務器環境無關、與分站后臺編寫語言無關,只要把一個通用的SSOLogin.htm頁面放到主目錄下即可。在這個登錄過程中需要注意幾個問題:1)為了避免GET方式傳遞用戶名、密碼過于暴露,可以采用隱藏iframe的方式,在跳轉頁動態產生一個不可見的iframe,iframe的src指向分站的SSOLogin.htm,登錄成功后 SSOlogin.htm 通過 parent.location.href修改父頁面的路徑以跳轉到登錄后頁面,當然不采用這種方式也可以,因為用戶需要登錄中心站點以后才會向分站傳遞用戶名和密碼,可以保證只有登錄者本人可以看到GET參數內容;2)某些分站的用戶名可能是中文,這樣會產生中文編碼問題,需要根據分站登錄頁的GBK和UTF-8等編碼方式對中文進行編碼,然后POST,否則不能成功登錄[2]。
某些第三方的網站登錄會要求輸入驗證碼,由于該系統在臺內應用沒有遇到這種情況所以沒有過多處理,可以考慮將驗證碼圖片從分站抓取到主站登錄頁手動輸入。
1)用戶打開主站登錄頁輸入用戶名密碼,選擇需要登錄的分站進行登錄。授權管理在這里被當作一個分站,用戶登錄后可以進行授權管理,如圖1所示。

圖1 單點登錄授權管理(截圖)
2)當檢測到本地cookie存在并有效時,可以不輸入用戶名密碼快速登錄,也可以選擇其他用戶登錄,如圖2所示。
3)當用戶第一次登錄某個分站時,要求驗證分站對應用戶名密碼,記錄對應關系,以后登錄不需要這個過程,直接進入分站,如圖3所示。

圖2 檢測到已經登錄的賬戶(截圖)

圖3 驗證分站對應用戶名密碼(截圖)
4)可以對分站登錄頁進行改造,在分站登錄頁檢測到有單點登錄cookie存在,即用戶使用過單點登錄系統時,提醒用戶使用快速登錄,如圖4所示。

圖4 提醒用戶使用快速登錄(截圖)
系統上線后,大大方便了用戶對于各信息系統的使用,用戶不再需要記憶很多用戶名和密碼,在一個頁面完成多個系統的登錄;同時,可以設置一個比較復雜的密碼,較原來提高了安全性。但同時也存在一些弊端,原來有用戶習慣借出自己的域賬號或借用別人的域賬號,在單點登錄的情況下,信息泄露的風險就比較大。可以引導用戶妥善保管自己賬號或者另建一套用戶名密碼獨立于域賬號。總而言之,單點登錄對于系統管理、用戶使用利大于弊。
1)HTTP Referer是header的一部分,當瀏覽器向Web服務器發送請求時,一般會帶上Referer,告訴服務器這是從哪個頁面鏈接過來的。分站登錄頁上一般會放置單點登錄鏈接,用戶可以使用原有方式登錄,也可以點擊鏈接跳轉到主站登錄頁,主站登錄頁根據HTTP Referer判斷來源分站,主動替用戶選擇登錄分站,減少用戶操作,提升體驗[3]。
2)分站登錄頁檢測到有單點登錄cookie存在,提醒用戶使用快速登錄,經同意后跳轉到主站登錄頁,引導用戶盡量使用單點登錄。單點登錄cookie由主站創建,和分站很可能不在同一個域,跨域是不允許cookie讀寫的,因此采用變通手法:有分站b1.bbb.com的網頁,內嵌主站 a.aaa.com 的 iframe(命名為 iframeA),iframeA 再內嵌b2.bbb.com的iframe(命名為iframeB),iframeA取得主站*.aaa.com 的 域 的 cookie 值 ,通 過 URL 傳 遞 給 iframeB b2.bbb.com,iframeB b2.bbb.com 和 b1.bbb.com 屬于同一個域,可以通過javascript傳值,告訴分站登錄頁主站的cookie值,以此來實現*.aaa.com和*.bbb.com這樣跨域的cookie傳遞[4]。
3)通常單點登錄系統要求各分站用戶名統一,方便識別用戶;或者管理員后臺統一建立對應關系。本系統創新使用“授權”的方式,將用戶名映射這項工作交給用戶自己,既保證了安全,也更加靈活,用戶可以在某分站擁有多個用戶名,由自己選擇授權。
:
[1] 洪帆,崔國華,付小青.信息安全概論[M].武漢:華中科技大學出版社,2005.
[2]ZAKAS N C.JavaScript高級程序設計[M].李松峰,曹力,譯.北京:人民郵電出版社,2010.
[3]WALTHER S,HOFFMAN K,DUDEK N.ASP.NET4揭秘:卷1[M].譚振林,黎志,朱興林,等,譯.北京:人民郵電出版社,2010.
[4] 單東林,張曉菲,魏然.鋒利的jQuery[M].北京:人民郵電出版社,2009.
TN948
B
責任編輯:任健男
2013-08-20