趙侃侃 戴佳男
摘要:?jiǎn)吸c(diǎn)登錄(SSO)技術(shù)已成為現(xiàn)今Web應(yīng)用系統(tǒng)廣泛采用的集中認(rèn)證授權(quán)技術(shù),在比較分析了4種典型的單點(diǎn)登錄實(shí)現(xiàn)方案的基礎(chǔ)上,選擇并改進(jìn)了基于CAS協(xié)議的單點(diǎn)登錄系統(tǒng)。由于前后端分離開(kāi)發(fā)部署的Web應(yīng)用不能直接使用CAS協(xié)議的單點(diǎn)登錄系統(tǒng),改進(jìn)并重新封裝了基于CAS協(xié)議的單點(diǎn)登錄系統(tǒng)客戶端插件,使之既能支持前后端分離開(kāi)發(fā)部署的Web應(yīng)用,也能支持前后端集中開(kāi)發(fā)部署的Web應(yīng)用直接使用而無(wú)需應(yīng)用修改代碼,實(shí)現(xiàn)了應(yīng)用的無(wú)侵入性集成CAS協(xié)議的單點(diǎn)登錄系統(tǒng)功能。
關(guān)鍵詞:?jiǎn)吸c(diǎn)登錄;Web應(yīng)用;CAS協(xié)議
中圖分類號(hào):TP393文獻(xiàn)標(biāo)志碼:A文章編號(hào):1008-1739(2020)09-68-4
0引言
隨著B(niǎo)/S架構(gòu)的Web應(yīng)用系統(tǒng)越來(lái)越廣泛地普及和發(fā)展,“一次驗(yàn)證,多次登陸”的單點(diǎn)登錄技術(shù)[1]也應(yīng)運(yùn)而生。單點(diǎn)登錄技術(shù)是用戶只登錄一次,就可以訪問(wèn)所有接入單點(diǎn)登錄服務(wù)的應(yīng)用系統(tǒng)的技術(shù)。通過(guò)建立一個(gè)集中的認(rèn)證服務(wù)器,并在應(yīng)用系統(tǒng)中配置請(qǐng)求攔截器等方式驗(yàn)證用戶的登錄狀態(tài)并控制請(qǐng)求的跳轉(zhuǎn)功能,從而實(shí)現(xiàn)單點(diǎn)登錄功能。單點(diǎn)登錄功能不需要用戶記憶各大應(yīng)用系統(tǒng)的不同的用戶名和密碼,減少了用戶在多個(gè)系統(tǒng)間登錄的操作。另外,單點(diǎn)登錄技術(shù)抽取了用戶認(rèn)證和授權(quán)功能,第三方接入單點(diǎn)登錄服務(wù)的Web應(yīng)用系統(tǒng)將認(rèn)證授權(quán)功能交由單點(diǎn)登錄系統(tǒng)處理,這樣有助于第三方應(yīng)用更加專注自身業(yè)務(wù)的設(shè)計(jì)和開(kāi)發(fā)。對(duì)于多套應(yīng)用系統(tǒng)的企業(yè)來(lái)說(shuō),單點(diǎn)登錄功能也被很多企業(yè),尤其是國(guó)外的相關(guān)企業(yè)采用,這是作為應(yīng)用系統(tǒng)設(shè)計(jì)初期就必須具備的基本功能[2]。
1常用單點(diǎn)登錄方案
目前常用的幾種單點(diǎn)登錄協(xié)議有基于SAML協(xié)議的單點(diǎn)登錄方案[3]、基于Kerberos身份認(rèn)證機(jī)制的單點(diǎn)登錄方案[4]、基于Passport協(xié)議的單點(diǎn)登錄方案[5]及基于CAS協(xié)議的單點(diǎn)登錄方案[6]。
SAML是一種基于XML標(biāo)準(zhǔn)的安全斷言標(biāo)記語(yǔ)言,用于安全傳輸聲明。SAML主要作用包括認(rèn)證聲明、屬性聲明和授權(quán)聲明,但是SAML協(xié)議的單點(diǎn)登錄方案應(yīng)用起來(lái)較為復(fù)雜,并且代碼沒(méi)有開(kāi)源,改造十分困難。Kerberos協(xié)議是由MIT為Athena項(xiàng)目設(shè)計(jì)的身份認(rèn)證系統(tǒng),但該協(xié)議只認(rèn)證不鑒權(quán)?;赑assport協(xié)議的單點(diǎn)登錄是由微軟公司運(yùn)行的一種Web服務(wù),通過(guò)在瀏覽器端設(shè)置Cookie的方法實(shí)現(xiàn)單點(diǎn)登錄功能?;赑assport協(xié)議的單點(diǎn)登錄能夠集中通過(guò)微軟認(rèn)證的第三方應(yīng)用,并儲(chǔ)存用戶登錄信息(如用戶名和密碼),但該方案目前代碼沒(méi)有開(kāi)源,使用該P(yáng)assport服務(wù)仍需收費(fèi)?;贑AS協(xié)議的單點(diǎn)登錄方案是由耶魯大學(xué)發(fā)起的一個(gè)企業(yè)級(jí)的單點(diǎn)登錄系統(tǒng),該項(xiàng)目于2001年開(kāi)始,迄今已經(jīng)發(fā)展到6.X.X版本,在GitHub上不斷地完善和升級(jí)。該項(xiàng)目使用Java語(yǔ)言,采用Spring Web Flow等技術(shù),支持CAS,REST等協(xié)議。該協(xié)議配置應(yīng)用簡(jiǎn)單、代碼結(jié)構(gòu)清晰、使用改造成本低,因此基于該協(xié)議的單點(diǎn)登錄方案已被廣泛采用。
2基于CAS協(xié)議的單點(diǎn)登錄
2.1 CAS協(xié)議單點(diǎn)登錄認(rèn)證原理
基于CAS協(xié)議的單點(diǎn)登錄系統(tǒng)通過(guò)在Cookie中存儲(chǔ)登錄憑證CASTGC,并在服務(wù)端存儲(chǔ)用戶登錄后生成的臨時(shí)和持久票據(jù)信息實(shí)現(xiàn)單點(diǎn)登錄功能。CAS協(xié)議提供的客戶端插件基于過(guò)濾器的實(shí)現(xiàn)原理,在傳統(tǒng)前后端集成在一起的應(yīng)用中易于使用,當(dāng)用戶未登錄或登錄失效時(shí),可直接通過(guò)服務(wù)端重定向至登錄頁(yè)面。
基于CAS協(xié)議的單點(diǎn)登錄系統(tǒng)中,只有服務(wù)端才能獲取用戶的用戶名、密碼等安全信息,第三方接入的應(yīng)用系統(tǒng)沒(méi)有登錄入口,只接收服務(wù)端的間接授權(quán)。間接授權(quán)通過(guò)令牌實(shí)現(xiàn),服務(wù)端驗(yàn)證用戶的用戶名和密碼是否匹配,匹配后創(chuàng)建授權(quán)令牌,在接下來(lái)的跳轉(zhuǎn)過(guò)程中,授權(quán)令牌作為參數(shù)發(fā)送給各個(gè)應(yīng)用系統(tǒng),若應(yīng)用系統(tǒng)拿到令牌,即得到了授權(quán),局部會(huì)話即可創(chuàng)建成功,此過(guò)程就是基于CAS協(xié)議的單點(diǎn)登錄驗(yàn)證原理,如圖1所示。
用戶訪問(wèn)應(yīng)用系統(tǒng)1時(shí),應(yīng)用系統(tǒng)1發(fā)現(xiàn)用戶未登錄,跳轉(zhuǎn)至CAS服務(wù)端,并將該用戶訪問(wèn)應(yīng)用系統(tǒng)1的地址作為參數(shù)傳入。CAS服務(wù)端檢測(cè)到用戶未登錄,將瀏覽器頁(yè)面跳轉(zhuǎn)至登錄頁(yè)面,用戶輸入用戶名、密碼提交申請(qǐng)至CAS服務(wù)端進(jìn)行認(rèn)證,認(rèn)證校驗(yàn)成功后,創(chuàng)建用戶與CAS服務(wù)端的會(huì)話,該會(huì)話為全局會(huì)話,同時(shí)創(chuàng)建授權(quán)令牌,CAS服務(wù)端將攜帶令牌跳轉(zhuǎn)至用戶最初的請(qǐng)求頁(yè)面。
應(yīng)用系統(tǒng)1拿到令牌后,至CAS服務(wù)端校驗(yàn)令牌是否合法,校驗(yàn)有效后將結(jié)果返回給應(yīng)用系統(tǒng)1,應(yīng)用系統(tǒng)1將使用該令牌創(chuàng)建與用戶的局部會(huì)話,并跳轉(zhuǎn)至登錄后的頁(yè)面。當(dāng)用戶再次訪問(wèn)應(yīng)用系統(tǒng)2時(shí),應(yīng)用系統(tǒng)2發(fā)現(xiàn)該用戶未登錄,將用戶訪問(wèn)的應(yīng)用系統(tǒng)2的地址作為參數(shù)一起發(fā)送至CAS服務(wù)端,CAS服務(wù)端發(fā)現(xiàn)該用戶已登錄過(guò),則帶著令牌跳轉(zhuǎn)回應(yīng)用系統(tǒng)2,應(yīng)用系統(tǒng)2拿到令牌后再發(fā)送給CAS服務(wù)端校驗(yàn)令牌有效性,令牌若有效,用戶即可訪問(wèn)應(yīng)用系統(tǒng)2的頁(yè)面,無(wú)需再次登錄。
2.2存在的問(wèn)題
隨著前后端分離開(kāi)發(fā)部署模式的不斷興起,越來(lái)越多的Web應(yīng)用選用前后端分離的模式進(jìn)行開(kāi)發(fā)部署,前后端之間的交互僅通過(guò)REST接口,主要好處是便于降低前后端代碼間的耦合度、部署和維護(hù),以及后端項(xiàng)目的拓展升級(jí)。但針對(duì)這種前端和后端之間只通過(guò)接口進(jìn)行交互的Web應(yīng)用,如果使用傳統(tǒng)的CAS協(xié)議單點(diǎn)登錄功能,后端則無(wú)法直接控制前端進(jìn)行重定向,必須通過(guò)接口的方式通知前端進(jìn)行重定向的動(dòng)作以及重定向的URL,前端再通過(guò)解析該接口的內(nèi)容進(jìn)行跳轉(zhuǎn)。
雖然前后端分離Web應(yīng)用已逐步流行,但傳統(tǒng)的前后端集中部署的模式仍然占有很大的比例,因此,需要改進(jìn)傳統(tǒng)的基于CAS協(xié)議的單點(diǎn)登錄系統(tǒng),使之既能支持傳統(tǒng)模式的Web應(yīng)用,也能支持前后端分離部署的Web應(yīng)用。
3支持多模式單點(diǎn)登錄系統(tǒng)
基于CAS協(xié)議的單點(diǎn)登錄方案利用瀏覽器客戶端進(jìn)行訪問(wèn)的重定向和跳轉(zhuǎn),而前后端分離部署的Web應(yīng)用無(wú)法直接控制瀏覽器的重定向和跳轉(zhuǎn),因此,該協(xié)議對(duì)于支撐前后端分離部署的Web應(yīng)用完成單點(diǎn)登錄功能存在問(wèn)題。
支持多模式單點(diǎn)登錄系統(tǒng)分為3部分:①CAS認(rèn)證中心:用于應(yīng)用的授權(quán)管理以及用戶認(rèn)證,集中部署在一個(gè)中心點(diǎn)或采用CAS服務(wù)器集群的模式進(jìn)行部署;②第三方Web應(yīng)用:需要連接CAS認(rèn)證中心進(jìn)行單點(diǎn)登錄認(rèn)證的應(yīng)用,數(shù)量為一個(gè)或多個(gè);③改進(jìn)的CAS認(rèn)證客戶端:原始的CAS認(rèn)證客戶端只提供了過(guò)濾器的方法(插件模式)用于前后端集中部署應(yīng)用進(jìn)行單點(diǎn)登錄認(rèn)證,本文改進(jìn)了原始的CAS客戶端,同時(shí)提供了2種用戶認(rèn)證的方法,一種是原有的插件模式進(jìn)行認(rèn)證,另一種是接口調(diào)用模式進(jìn)行認(rèn)證,分別用于支持前后端集中部署應(yīng)用以及前后端分離部署應(yīng)用。另外,改進(jìn)的CAS認(rèn)證客戶端還包含一個(gè)前端適配插件,用于攔截用戶請(qǐng)求、判斷是否登錄、解析后端認(rèn)證結(jié)果及重定向至登錄頁(yè)面,如圖2所示。
在第三方Web應(yīng)用系統(tǒng)配置使用模式后,可使應(yīng)用系統(tǒng)運(yùn)行于接口模式或者插件模式。在接口模式下,應(yīng)用系統(tǒng)應(yīng)首先在配置文件中配置CAS服務(wù)端URL。其次,當(dāng)應(yīng)用系統(tǒng)集成的CAS客戶端接收并解析CAS服務(wù)端的返回值后,將該返回值封裝成接口,再由前端插件調(diào)用該接口并解析結(jié)果后實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)等操作,完成單點(diǎn)登錄功能,其中,CAS客戶端封裝的接口主要包括用戶登錄接口、用戶退出接口、判斷用戶是否登錄接口、獲取用戶信息接口及獲取用戶票據(jù)接口等。
如果用戶未登錄,CAS客戶端將訪問(wèn)頁(yè)面URL作為參數(shù)傳遞至前端插件,并由前端插件讀取配置文件中的CAS服務(wù)端地址,并重定向至登錄頁(yè)面URL。如果用戶已登錄,CAS客戶端插件會(huì)攔截該請(qǐng)求,從請(qǐng)求中獲取與用戶對(duì)應(yīng)的標(biāo)志信息并判斷該請(qǐng)求中所攜帶的標(biāo)志信息是否合法和有效用戶是否存在有效登錄信息,如果合法有效已經(jīng)存在,則請(qǐng)求通過(guò),并將已登錄標(biāo)志信息作為請(qǐng)求接口參數(shù)傳遞至前端插件。在插件模式下,應(yīng)用系統(tǒng)直接通過(guò)CAS客戶端控制前端頁(yè)面的跳轉(zhuǎn)實(shí)現(xiàn)單點(diǎn)登錄功能,也就是傳統(tǒng)的CAS客戶端提供的功能。如果用戶未登錄,CAS客戶端將訪問(wèn)頁(yè)面URL作為參數(shù)直接跳轉(zhuǎn)至登錄頁(yè)面。如果用戶已登錄,且判斷該用戶的登錄信息合法后,將該標(biāo)識(shí)信息設(shè)置在請(qǐng)求中的Cookie中傳遞。另外,對(duì)于使用C++或者php等非Java語(yǔ)言開(kāi)發(fā)的應(yīng)用,也可以通過(guò)接口模式進(jìn)行單點(diǎn)登錄功能接入。
4認(rèn)證流程
4.1插件模式
①當(dāng)用戶訪問(wèn)APP1時(shí),由于已配置部署模式,CAS認(rèn)證中心客戶端根據(jù)該模式選用過(guò)濾器的方式進(jìn)行請(qǐng)求攔截,若APP1服務(wù)端已存在有效票據(jù),則說(shuō)明已登錄,訪問(wèn)通過(guò);否則,過(guò)濾器將攔截請(qǐng)求并重定向到CAS認(rèn)證中心登錄頁(yè)面。
②用戶登錄成功后,CAS認(rèn)證中心生成登錄票據(jù),同時(shí),CAS認(rèn)證中心在瀏覽器端的Cookie中寫(xiě)入登錄票據(jù)ID,并根據(jù)登錄票據(jù)和請(qǐng)求來(lái)源生成臨時(shí)票據(jù)作為參數(shù)跳轉(zhuǎn)回APP1。
③APP1的CAS認(rèn)證中心客戶端獲取到臨時(shí)票據(jù)后,發(fā)送至CAS認(rèn)證中心進(jìn)行驗(yàn)證。
④CAS認(rèn)證中心驗(yàn)證臨時(shí)票據(jù)后,返回登錄票據(jù)。
⑤APP1的CAS認(rèn)證中心客戶端接收到登錄票據(jù),并重定向到原始請(qǐng)求鏈接和通過(guò)。
⑥用戶首次訪問(wèn)另一應(yīng)用APP2時(shí),由于APP2當(dāng)前沒(méi)有有效票據(jù),APP2將請(qǐng)求重定向至CAS認(rèn)證中心判斷該次請(qǐng)求是否已登錄。
⑦CAS認(rèn)證中心在接收到請(qǐng)求后,從Cookie中獲取票據(jù)ID,并根據(jù)票據(jù)ID查找票據(jù),驗(yàn)證有效票據(jù)是否存在。
⑧當(dāng)票據(jù)存在時(shí),證明已登錄,APP2根據(jù)票據(jù)以及請(qǐng)求來(lái)源應(yīng)用生成臨時(shí)票據(jù),并將該臨時(shí)票據(jù)添加到應(yīng)用系統(tǒng)的請(qǐng)求URL中并跳轉(zhuǎn);當(dāng)票據(jù)不存在時(shí),則會(huì)重定向至CAS認(rèn)證中心登錄頁(yè)面重新進(jìn)行登錄。
⑨APP2接收到包含有臨時(shí)票據(jù)的請(qǐng)求后,從請(qǐng)求鏈接中提取臨時(shí)票據(jù)并發(fā)送至CAS認(rèn)證中心驗(yàn)證。
上述描述了支持多模式的單點(diǎn)登錄系統(tǒng),該單點(diǎn)登錄系統(tǒng)改進(jìn)實(shí)現(xiàn)了基于CAS協(xié)議的單點(diǎn)登錄系統(tǒng)。該方法通過(guò)修改和增加客戶端插件和前端插件,將用戶請(qǐng)求進(jìn)行攔截和處理,而不需要應(yīng)用程序修改代碼與CAS服務(wù)器交互進(jìn)行邏輯校驗(yàn),實(shí)現(xiàn)了前后端分離開(kāi)發(fā)部署的Web應(yīng)用和前后端集中開(kāi)發(fā)部署的Web應(yīng)用的無(wú)侵入性集成單點(diǎn)登錄功能。
5結(jié)束語(yǔ)
本文所描述的支持多模式的單點(diǎn)登錄系統(tǒng),實(shí)現(xiàn)了前后端分離開(kāi)發(fā)部署的Web應(yīng)用和前后端集中開(kāi)發(fā)部署的Web應(yīng)用的無(wú)侵入性集成單點(diǎn)登錄功能,但是還需根據(jù)工作實(shí)際,進(jìn)一步完善諸如完整的日志審計(jì)、日志導(dǎo)出功能,實(shí)現(xiàn)用戶操作的可追溯性,提高系統(tǒng)的安全性。此外,票據(jù)信息的中心化存儲(chǔ)對(duì)高并發(fā)訪問(wèn)條件下服務(wù)器的穩(wěn)定性、可擴(kuò)展性以及安全性也帶來(lái)了挑戰(zhàn),能夠支持高并發(fā)、分布式的單點(diǎn)登錄服務(wù)器集群,提供一個(gè)更加可靠且安全的單點(diǎn)登錄系統(tǒng)也是必須考慮的。
參考文獻(xiàn)
[1]林滿山,郭荷清.單點(diǎn)登錄技術(shù)的現(xiàn)狀及發(fā)展[J].計(jì)算機(jī)應(yīng)用,2004(S1):248-250.
[2]蘇悅洪.基于CAS協(xié)議的單點(diǎn)登錄系統(tǒng)的研究與改進(jìn)[D].廣州:華南理工大學(xué),2014.
[3] WU KX, YU XL. A Model of Unite-authentication Single Sign-on Based on SAML Underlying Web[C]// Proceedings of the 2009 Second International Conference on Information and Computing Science, 2009(2):211-213.
[4]崔培枝,王朝君,劉海燕. Kerberos認(rèn)證技術(shù)研究及分析[J].計(jì)算機(jī)與現(xiàn)代化,2001(5):35-39,43.
[5] OPPLIGER R. Microsoft .NET Passport: a Security Analysis[J]. IEEE Computer, 2003:36.
[6]王揚(yáng),俞烽.信息系統(tǒng)行為審計(jì)管理[J].指揮信息系統(tǒng)與技術(shù),2012,3(2):44-48.