杜歆文
(蘇州廣播電視總臺 技術(shù)中心,江蘇 蘇州 215006)
單點登錄系統(tǒng)的設(shè)計與實現(xiàn)
杜歆文
(蘇州廣播電視總臺 技術(shù)中心,江蘇 蘇州 215006)
研究了單點登錄系統(tǒng)的設(shè)計與實現(xiàn),利用每人唯一的賬號和密碼實現(xiàn)多個系統(tǒng)的登錄認(rèn)證。討論了兩種單點登錄實現(xiàn)方式,一種為主站通過非對稱加密算法的私鑰生成憑證,分站認(rèn)證登錄,另一種方式為主站模擬用戶登錄行為,采用POST參數(shù)的方式登錄分站。兩種實現(xiàn)方式各有利弊,適合不同情況。該系統(tǒng)對用戶使用感受、系統(tǒng)安全性有較好影響。
單點登錄;非對稱加密;授權(quán);參數(shù)傳遞;跨域
【本文獻(xiàn)信息】杜歆文.單點登錄系統(tǒng)的設(shè)計與實現(xiàn)[J].電視技術(shù),2013,37(24).
隨著信息化的發(fā)展和全臺網(wǎng)的建設(shè),越來越多的工作依賴網(wǎng)絡(luò)、計算機(jī),工作人員需要記憶大量的用戶名、密碼,每天上班打開計算機(jī)登錄域,寫稿件,查詢媒資,收發(fā)郵件……每一項工作都需要輸入用戶名、密碼。由于系統(tǒng)開發(fā)使用時間不同,造成了用戶名不統(tǒng)一,有的使用拼音縮寫,有的使用中文名,還有的使用昵稱登錄;用戶為了使用方便,有的使用簡單密碼登錄,有的被強(qiáng)制設(shè)置為復(fù)雜密碼,造成用戶的困惑。因此需要簡化登錄過程,統(tǒng)一用戶名和密碼。
目前蘇州臺采用Windows域管理用戶和計算機(jī),用戶必須擁有一個域賬號才能登錄計算機(jī),接入網(wǎng)絡(luò)。因此,考慮把該賬號作為用戶統(tǒng)一且唯一的身份認(rèn)證信息。
由于Web系統(tǒng)的便利性,以及越來越完善的功能,近年來,絕大多數(shù)應(yīng)用系統(tǒng)都采用了B/S架構(gòu),因此,本文主要考慮Web系統(tǒng)的用戶管理、登錄問題。
將現(xiàn)有系統(tǒng)分成兩大類:一類系統(tǒng)是由臺內(nèi)自行開發(fā)研制,比如固定資產(chǎn)管理、技術(shù)客服系統(tǒng)等;還有一類是由第三方廠商進(jìn)行開發(fā)部署,比如媒資、文稿、郵箱等。對于前者,可以對登錄模塊進(jìn)行修改,以適應(yīng)單點登錄模塊的需求,同時,在以后開發(fā)的系統(tǒng)中,可以省略登錄模塊,依靠單點登錄系統(tǒng)對用戶進(jìn)行管理。對于后一類系統(tǒng),無法進(jìn)行定制開發(fā),也沒辦法做任何修改,只能去適應(yīng)現(xiàn)有系統(tǒng),依賴各系統(tǒng)原有的登錄模塊來實現(xiàn)單點登錄。考慮到用戶習(xí)慣的延續(xù)和系統(tǒng)切割的平滑,計劃保留原有各系統(tǒng)登錄模塊,用戶可以完全保持原有習(xí)慣,再逐步向單點登錄引導(dǎo)。
為了方便描述,先約定幾個概念:1)總站,也可稱為主站、中心站點,單點登錄系統(tǒng)中驗證用戶登錄,并向分站跳轉(zhuǎn);2)分站,也可稱子系統(tǒng),原有的業(yè)務(wù)系統(tǒng)需要接入單點登錄;3)憑證,英文token,子系統(tǒng)以此識別授權(quán)用戶。
原登錄過程為用戶打開所需登錄系統(tǒng)首頁,輸入用戶名、密碼,登錄系統(tǒng)。現(xiàn)在考慮以下登錄過程:用戶訪問未授權(quán)頁面時被轉(zhuǎn)向到總站登錄頁,或者用戶直接打開該登錄頁,輸入用戶名、密碼,自動判斷或手動選擇需要登錄的子系統(tǒng),主站驗證通過后發(fā)送憑證給分站,并轉(zhuǎn)向分站驗證通過后允許用戶登錄。
該登錄過程對于自行開發(fā)的網(wǎng)站只需要稍作修改即可實現(xiàn),整個過程符合用戶使用習(xí)慣,并能夠保證安全可靠。但需要考慮兩個問題:
1)對于以后開發(fā)的站點,是延續(xù)以前的方式擁有獨立的登錄模塊,還是可以省略,完全依賴單點登錄。筆者認(rèn)為分站是可以完全信任主站的,對于主站傳到分站的憑證,如果可以完全證實用戶身份的話,分站將允許用戶登錄。在這種情況下,分站可以省略用戶登錄驗證過程,完全依賴單點登錄系統(tǒng)。但是由于各系統(tǒng)的功能不同,子系統(tǒng)還需要自己的權(quán)限管理。
2)面對不可修改的分站,要想實現(xiàn)這種登錄過程就一籌莫展了。為了使用戶體驗統(tǒng)一,同樣輸入用戶名、密碼,選擇登錄子系統(tǒng)后,總站模擬用戶行為,去分站提交對應(yīng)的用戶名、密碼,完成登錄后,總站轉(zhuǎn)向分站登錄后頁面。對于用戶來說,需要做的只是輸入必需信息,體驗完全一樣。
該系統(tǒng)數(shù)據(jù)結(jié)構(gòu)簡單,主要需要保存兩類數(shù)據(jù),一種是用戶信息,記錄總站用戶名和分站用戶名的對應(yīng)關(guān)系;還有一種是站點信息,記錄分站的地址、登錄頁、登錄方式等信息。
2.3.1 主站登錄頁
主站登錄頁用于接收用戶的輸入,包括用戶名、密碼、選擇登錄分站,當(dāng)用戶允許保存cookie時,在用戶本地保存加密后的用戶名。用戶訪問主站登錄頁,頁面檢測到cookie,并提交給服務(wù)器,服務(wù)器對cookie信息進(jìn)行檢查、解密,確認(rèn)用戶信息完整后提供快速登錄功能,用戶只需要選擇登錄分站名稱,而不需要重復(fù)輸入用戶名、密碼,可以直接訪問分站。
2.3.2 可修改的站點登錄
總站將憑證傳給分站,分站驗證憑證后允許登錄,在這個過程中關(guān)鍵問題在于建立憑證,能夠保證憑證的安全性,使分站能夠完全信任。
此處需要用到非對稱加密算法。通常接觸較多的是對稱加密算法:發(fā)送方將需要發(fā)送的明文信息使用密鑰,通過一系列運(yùn)算產(chǎn)生密文發(fā)送,接收方收到密文后使用同樣的密鑰通過運(yùn)算還原出明文,所謂對稱,就是指采用這種方式,使加、解密雙方的密鑰是相同的。
對于非對稱算法,顯而易見,即加密、解密過程中的密鑰不同。非對稱加密算法又稱公開密鑰加密算法,該算法需要兩個密鑰——公開密鑰和私有密鑰,這兩個密鑰是一對。如果用公開密鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進(jìn)行加密,那么只有用對應(yīng)的公開密鑰才能解密。甲方生成一對密鑰并將其中的一把作為公用密鑰向其他方公開,得到該公用密鑰的乙方使用該密鑰對機(jī)密信息進(jìn)行加密后再發(fā)送給甲方,甲方再用自己保存的另一把專用密鑰對加密后的信息進(jìn)行解密。除了傳輸數(shù)據(jù),非對稱密鑰還用來進(jìn)行數(shù)字簽名:發(fā)送方A對發(fā)送的報文M生成一個摘要X1并用自己的私鑰加密這個摘要X1,接收方B對使用A的公鑰解開這個加密摘要,得到X1并對比接收到的報文M重新生成的摘要X2,如果一樣,說明報文M在傳遞過程沒有被修改,的確是A發(fā)送的[1]。
在本系統(tǒng)中采用了常用的非對稱加密算法——RSA,并對非對稱加密算法兩種常規(guī)的使用方法稍作修改,使其更符合本系統(tǒng)的應(yīng)用。
對于每個分站,需要建立一對密鑰——一個公鑰和一個私鑰。私鑰由主站妥善保管,公鑰對分站公開。主站登錄頁驗證用戶登錄后,根據(jù)用戶選擇分站查找該分站對應(yīng)用戶名,如果不存在,則轉(zhuǎn)向一個頁面,要求用戶輸入需要登錄分站的用戶名、密碼,將這一過程稱之為授權(quán)。授權(quán)頁去分站數(shù)據(jù)庫驗證用戶名和密碼,驗證通過后將主站用戶名和分站用戶名建立對應(yīng)關(guān)系并保存,授權(quán)過程只有第一次登錄分站時需要進(jìn)行,目的是建立兩個站點用戶名之間的對應(yīng)關(guān)系,密碼不需要保存。授權(quán)成功后主站對分站用戶名用對應(yīng)私鑰進(jìn)行加密,并將加密后的結(jié)果傳遞給分站,分站用自己的公鑰解密,正確解密將得到需要登錄的分站用戶名。
通常情況,如果篡改加密后密文是無法正常解密的,但不排除特殊情況,因此加入校驗機(jī)制(此處使用最簡單的長度校驗),將用戶名和校驗碼一起使用私鑰加密,分站使用公鑰解密后檢查用戶名和校驗碼,符合則認(rèn)為解密成功。在傳輸過程中,還需要防止惡意攻擊,如果主站、分站以外的第三者截取到加密信息,不需要輸入密碼就可以登錄系統(tǒng)。因此,在用戶名、校驗碼之外,再加上時間戳,這三個信息一起加密傳輸,分站得到信息解密,先檢查校驗碼,判斷是否正確解密,確認(rèn)密鑰的正確性,再檢查時間戳,超過有效時間則認(rèn)為該信息無效,不允許登錄。這樣即使加密信息被截取重放,由于超過了有效時間,也無法正常登錄系統(tǒng)。
2.3.3 不可修改的站點登錄
該類站點登錄,需要主站模擬用戶登錄行為,達(dá)到單點登錄的目的。
如前所述,這里同樣需要“授權(quán)”這一過程建立主站用戶名和分站用戶名的關(guān)聯(lián)。不同的是對于一些數(shù)據(jù)庫加密保存密碼的系統(tǒng),主站還需要保存用戶的明文密碼。
表單(form)有兩種方法GET和POST把數(shù)據(jù)提交給服務(wù)器。GET請求的數(shù)據(jù)會附在URL之后,以“?”分割URL和傳輸數(shù)據(jù),參數(shù)之間以“&”相連,如login.aspx?name=xxx&password=yyy。POST則是把提交的數(shù)據(jù)放置在HTTP包的包體中。絕大多數(shù)登錄頁面都是通過POST方式把相關(guān)參數(shù)提交到后臺進(jìn)行驗證。因此,需要程序模擬這個POST的過程登錄。
在JavaScript中,有一個很重要的安全性限制,被稱為同源策略(Same-Origin Policy),即JavaScript只能訪問與它的文檔在同一域下的內(nèi)容。比如www.a.com站點下的頁面元素或腳本和www.b.com站點是無法互相訪問的。顯然,總站和分站并不能保證都在同一個域名下,因此,這里產(chǎn)生了一個跨域POST的問題,解決方法有一些,本系統(tǒng)中使用的是一種比較簡單的方法:在分站的網(wǎng)站主目錄下放置一個靜態(tài)頁面,取名為SSOLogin.htm,中心站點將用戶名、密碼、登錄頁地址通過GET方式傳遞給這個 頁 面 ,如 SSOLogin.htm?username=aaa&password=bbb&posturl=ccc,該頁面得到參數(shù)信息后,按約定格式將用戶名、密碼等必需信息POST到登錄頁,登錄成功后轉(zhuǎn)向登錄后頁面。由于SSOLogin.htm是純靜態(tài)頁面,不需要服務(wù)器交互,可以做到與分站服務(wù)器環(huán)境無關(guān)、與分站后臺編寫語言無關(guān),只要把一個通用的SSOLogin.htm頁面放到主目錄下即可。在這個登錄過程中需要注意幾個問題:1)為了避免GET方式傳遞用戶名、密碼過于暴露,可以采用隱藏iframe的方式,在跳轉(zhuǎn)頁動態(tài)產(chǎn)生一個不可見的iframe,iframe的src指向分站的SSOLogin.htm,登錄成功后 SSOlogin.htm 通過 parent.location.href修改父頁面的路徑以跳轉(zhuǎn)到登錄后頁面,當(dāng)然不采用這種方式也可以,因為用戶需要登錄中心站點以后才會向分站傳遞用戶名和密碼,可以保證只有登錄者本人可以看到GET參數(shù)內(nèi)容;2)某些分站的用戶名可能是中文,這樣會產(chǎn)生中文編碼問題,需要根據(jù)分站登錄頁的GBK和UTF-8等編碼方式對中文進(jìn)行編碼,然后POST,否則不能成功登錄[2]。
某些第三方的網(wǎng)站登錄會要求輸入驗證碼,由于該系統(tǒng)在臺內(nèi)應(yīng)用沒有遇到這種情況所以沒有過多處理,可以考慮將驗證碼圖片從分站抓取到主站登錄頁手動輸入。
1)用戶打開主站登錄頁輸入用戶名密碼,選擇需要登錄的分站進(jìn)行登錄。授權(quán)管理在這里被當(dāng)作一個分站,用戶登錄后可以進(jìn)行授權(quán)管理,如圖1所示。
圖1 單點登錄授權(quán)管理(截圖)
2)當(dāng)檢測到本地cookie存在并有效時,可以不輸入用戶名密碼快速登錄,也可以選擇其他用戶登錄,如圖2所示。
3)當(dāng)用戶第一次登錄某個分站時,要求驗證分站對應(yīng)用戶名密碼,記錄對應(yīng)關(guān)系,以后登錄不需要這個過程,直接進(jìn)入分站,如圖3所示。
圖2 檢測到已經(jīng)登錄的賬戶(截圖)
圖3 驗證分站對應(yīng)用戶名密碼(截圖)
4)可以對分站登錄頁進(jìn)行改造,在分站登錄頁檢測到有單點登錄cookie存在,即用戶使用過單點登錄系統(tǒng)時,提醒用戶使用快速登錄,如圖4所示。
圖4 提醒用戶使用快速登錄(截圖)
系統(tǒng)上線后,大大方便了用戶對于各信息系統(tǒng)的使用,用戶不再需要記憶很多用戶名和密碼,在一個頁面完成多個系統(tǒng)的登錄;同時,可以設(shè)置一個比較復(fù)雜的密碼,較原來提高了安全性。但同時也存在一些弊端,原來有用戶習(xí)慣借出自己的域賬號或借用別人的域賬號,在單點登錄的情況下,信息泄露的風(fēng)險就比較大??梢砸龑?dǎo)用戶妥善保管自己賬號或者另建一套用戶名密碼獨立于域賬號??偠灾?,單點登錄對于系統(tǒng)管理、用戶使用利大于弊。
1)HTTP Referer是header的一部分,當(dāng)瀏覽器向Web服務(wù)器發(fā)送請求時,一般會帶上Referer,告訴服務(wù)器這是從哪個頁面鏈接過來的。分站登錄頁上一般會放置單點登錄鏈接,用戶可以使用原有方式登錄,也可以點擊鏈接跳轉(zhuǎn)到主站登錄頁,主站登錄頁根據(jù)HTTP Referer判斷來源分站,主動替用戶選擇登錄分站,減少用戶操作,提升體驗[3]。
2)分站登錄頁檢測到有單點登錄cookie存在,提醒用戶使用快速登錄,經(jīng)同意后跳轉(zhuǎn)到主站登錄頁,引導(dǎo)用戶盡量使用單點登錄。單點登錄cookie由主站創(chuàng)建,和分站很可能不在同一個域,跨域是不允許cookie讀寫的,因此采用變通手法:有分站b1.bbb.com的網(wǎng)頁,內(nèi)嵌主站 a.aaa.com 的 iframe(命名為 iframeA),iframeA 再內(nèi)嵌b2.bbb.com的iframe(命名為iframeB),iframeA取得主站*.aaa.com 的 域 的 cookie 值 ,通 過 URL 傳 遞 給 iframeB b2.bbb.com,iframeB b2.bbb.com 和 b1.bbb.com 屬于同一個域,可以通過javascript傳值,告訴分站登錄頁主站的cookie值,以此來實現(xiàn)*.aaa.com和*.bbb.com這樣跨域的cookie傳遞[4]。
3)通常單點登錄系統(tǒng)要求各分站用戶名統(tǒng)一,方便識別用戶;或者管理員后臺統(tǒng)一建立對應(yīng)關(guān)系。本系統(tǒng)創(chuàng)新使用“授權(quán)”的方式,將用戶名映射這項工作交給用戶自己,既保證了安全,也更加靈活,用戶可以在某分站擁有多個用戶名,由自己選擇授權(quán)。
:
[1] 洪帆,崔國華,付小青.信息安全概論[M].武漢:華中科技大學(xué)出版社,2005.
[2]ZAKAS N C.JavaScript高級程序設(shè)計[M].李松峰,曹力,譯.北京:人民郵電出版社,2010.
[3]WALTHER S,HOFFMAN K,DUDEK N.ASP.NET4揭秘:卷1[M].譚振林,黎志,朱興林,等,譯.北京:人民郵電出版社,2010.
[4] 單東林,張曉菲,魏然.鋒利的jQuery[M].北京:人民郵電出版社,2009.
TN948
B
責(zé)任編輯:任健男
2013-08-20