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