馬凱 楊強(qiáng) 謝善益
摘 要:在電力企業(yè)內(nèi)部網(wǎng)中,通過統(tǒng)一認(rèn)證服務(wù)來實(shí)現(xiàn)多個(gè)Web系統(tǒng)間登錄用戶信息和狀態(tài)共享已經(jīng)隨處可見,其中基于Apereo CAS的統(tǒng)一身份認(rèn)證是比較常見的一種解決方式。但是Web系統(tǒng)單點(diǎn)登錄只是嚴(yán)格限制用于那些通過瀏覽器訪問的應(yīng)用,在現(xiàn)如今的電力系統(tǒng)架構(gòu)中,一套系統(tǒng)往往會(huì)比較復(fù)雜,可能既包含了某些Web應(yīng)用,也可能會(huì)含有C/S架構(gòu)的客戶端、服務(wù)器或服務(wù)模塊,這種混合架構(gòu)場(chǎng)景下的統(tǒng)一身份認(rèn)證通過基本的CAS是難以實(shí)現(xiàn)的。本文正是在混合結(jié)構(gòu)模式下的配用電網(wǎng)數(shù)據(jù)管控平臺(tái)之上,在保留CAS原有SSO認(rèn)證過程的前提下,對(duì)其進(jìn)行一定擴(kuò)展,實(shí)現(xiàn)了C/S端跳向B/S端的統(tǒng)一認(rèn)證過程,由此擴(kuò)展了CAS的使用范圍。
關(guān)鍵詞:CAS;統(tǒng)一身份認(rèn)證;混合架構(gòu);單點(diǎn)登錄
DOI:10.16640/j.cnki.37-1222/t.2019.19.139
0 引言
近些年隨著互聯(lián)網(wǎng)技術(shù)和計(jì)算機(jī)技術(shù)的不斷發(fā)展,電力企業(yè)中的應(yīng)用系統(tǒng)規(guī)模越來越大、復(fù)雜度也越來越高,對(duì)系統(tǒng)的安全訪問控制需求也越來越嚴(yán)格[4]。傳統(tǒng)的單系統(tǒng)獨(dú)立登錄認(rèn)證的方式,在應(yīng)用系統(tǒng)部署較多的情況下,使得在不同系統(tǒng)之間切換時(shí)需要不斷重復(fù)錄入用戶名和密碼,甚至有時(shí)用戶在不同系統(tǒng)間使用的是同一套認(rèn)證信息,這無形中增加了系統(tǒng)使用者的麻煩,而且頻繁的錄入敏感信息,也增加了信息安全性風(fēng)險(xiǎn)[1-2]。因此,通過統(tǒng)一的認(rèn)證服務(wù)來實(shí)現(xiàn)不同系統(tǒng)間用戶信息共享,將各應(yīng)用系統(tǒng)的認(rèn)證過程連接起來是必然的趨勢(shì)[4]。
另一方面,系統(tǒng)的組成也越來越來復(fù)雜,往往一套大系統(tǒng)內(nèi)同時(shí)會(huì)包含多個(gè)子系統(tǒng)應(yīng)用,子系統(tǒng)的架構(gòu)類型也往往不同,一個(gè)子系統(tǒng)可能是瀏覽器/服務(wù)器(B/S)架構(gòu)的Web應(yīng)用,也可能為客戶端/服務(wù)器(C/S)類型,亦或是移動(dòng)端類型應(yīng)用,這對(duì)統(tǒng)一認(rèn)證服務(wù)的功能性提出了更高要求。
在當(dāng)今的互聯(lián)網(wǎng)應(yīng)用系統(tǒng)中,系統(tǒng)的登錄認(rèn)證過程可以通過Oauth2.0協(xié)議獲取微信、QQ、微博等等網(wǎng)絡(luò)應(yīng)用的用戶信息和狀態(tài),實(shí)現(xiàn)統(tǒng)一認(rèn)證和用戶信息共享。但是在電力企業(yè)內(nèi)部網(wǎng)絡(luò)中,受到網(wǎng)絡(luò)和安全管理等方面的限制,各應(yīng)用系統(tǒng)不可能也不允許連接到外部互聯(lián)網(wǎng)上去,因此都是通過獨(dú)立部署中心認(rèn)證服務(wù)器來實(shí)現(xiàn)單點(diǎn)登錄及統(tǒng)一認(rèn)證服務(wù)。
配用電網(wǎng)數(shù)據(jù)管控平臺(tái)建立并維護(hù)配用電網(wǎng)全域統(tǒng)一信息模型,結(jié)合自組織設(shè)備接入和多源匯集規(guī)范化融合配用電業(yè)務(wù)領(lǐng)域系統(tǒng)數(shù)據(jù),通過標(biāo)準(zhǔn)化服務(wù)為各應(yīng)用提供綜合數(shù)據(jù)應(yīng)用支持。配用電網(wǎng)數(shù)據(jù)管控平臺(tái)系統(tǒng)架構(gòu)為混合架構(gòu),包含多個(gè)B/S和C/S子系統(tǒng)應(yīng)用,平臺(tái)基于開源項(xiàng)目CAS來實(shí)現(xiàn)Web應(yīng)用間的單點(diǎn)登錄[3](Single Sign On,SSO),由于基于中心認(rèn)證服務(wù)(Central Authentication Service,CAS)的單點(diǎn)登錄嚴(yán)格適用于使用Web瀏覽器訪問的應(yīng)用程序,因此需要在CAS認(rèn)證服務(wù)器源碼額外開發(fā)新的服務(wù)擴(kuò)展接口來協(xié)調(diào)平臺(tái)的C/S端和B/S端之間的統(tǒng)一認(rèn)證過程。
1 配用電網(wǎng)數(shù)據(jù)管控平臺(tái)架構(gòu)
配用電網(wǎng)數(shù)據(jù)管控平臺(tái)完成系統(tǒng)部署范圍內(nèi)配用電網(wǎng)數(shù)據(jù)標(biāo)準(zhǔn)化匯集、管理及發(fā)布,包括Web應(yīng)用、系統(tǒng)控制臺(tái)及管理工具、后臺(tái)服務(wù)模塊服務(wù)器、Web認(rèn)證服務(wù)器等幾部分。
平臺(tái)的Web應(yīng)用系統(tǒng)基于CIM管控電網(wǎng)模型、實(shí)時(shí)、歷史等各類數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)瀏覽及管理、系統(tǒng)管理、任務(wù)監(jiān)測(cè)、服務(wù)器狀態(tài)監(jiān)測(cè)等系列功能。
系統(tǒng)控制臺(tái)(XFront)是平臺(tái)數(shù)據(jù)管理工具的啟動(dòng)入口,通過系統(tǒng)控制臺(tái)窗口可以打開運(yùn)行模型管理工具(XSchema)、數(shù)據(jù)管理工具(XStudio)等高級(jí)桌面維護(hù)工具,并且系統(tǒng)控制臺(tái)的主界面能夠顯示當(dāng)前服務(wù)器群及服務(wù)模塊的實(shí)時(shí)狀態(tài)概要。
后臺(tái)服務(wù)模塊服務(wù)器包括模型服務(wù)器、數(shù)據(jù)服務(wù)器、UA服務(wù)器、總線服務(wù)器、數(shù)據(jù)匯集任務(wù)模塊等,為應(yīng)用提供數(shù)據(jù)接口服務(wù)及運(yùn)行保障。
配用電網(wǎng)數(shù)據(jù)管控平臺(tái)的認(rèn)證需求:
Web應(yīng)用能在同一個(gè)網(wǎng)絡(luò)內(nèi)的任意計(jì)算機(jī)節(jié)點(diǎn)通過瀏覽器訪問,基于CAS的Web認(rèn)證服務(wù)器為Web應(yīng)用提供統(tǒng)一認(rèn)證服務(wù)。
系統(tǒng)控制臺(tái)及其管理的高級(jí)管理工具是C/S模式的客戶端程序,由維護(hù)人員進(jìn)行特殊維護(hù)時(shí)使用,需要安裝部署在指定的服務(wù)器,只有在指定的計(jì)算機(jī)節(jié)點(diǎn)才能使用。系統(tǒng)控制臺(tái)本身具有登錄訪問控制功能,登錄后才能啟動(dòng)Xschema、Xstudio等高級(jí)維護(hù)工具,系統(tǒng)控制臺(tái)自身的登錄不受Web認(rèn)證服務(wù)器管理。
系統(tǒng)控制臺(tái)同時(shí)也有鏈接按鈕能夠打開瀏覽器并跳轉(zhuǎn)到特定Web應(yīng)用頁(yè)面,此時(shí)的系統(tǒng)控制臺(tái)登錄狀態(tài)需要與Web認(rèn)證服務(wù)器進(jìn)行聯(lián)動(dòng)交互:當(dāng)系統(tǒng)控制臺(tái)已經(jīng)是登錄狀態(tài)時(shí),跳轉(zhuǎn)訪問的Web應(yīng)用也應(yīng)該是登錄狀態(tài),不需要在瀏覽器重新登錄驗(yàn)證。
平臺(tái)混合架構(gòu)示意圖如圖1所示。
2 CAS認(rèn)證原理
開源框架Apereo CAS通常稱為CAS[5],是一種針對(duì)Web的企業(yè)多語(yǔ)言單點(diǎn)登錄解決方案,并且能夠成為企業(yè)系統(tǒng)身份驗(yàn)證和授權(quán)需求的綜合平臺(tái)。
CAS的系統(tǒng)架構(gòu)由兩部分組成:CAS服務(wù)器和CAS客戶端,它們兩個(gè)之間通過各種協(xié)議進(jìn)行通信來完成交互認(rèn)證過程。
CAS服務(wù)器:CAS服務(wù)器是基于SpringMVC和Spring Webflow框架構(gòu)建的Java Servlet,主要職責(zé)是進(jìn)行用戶驗(yàn)證,并通過生成和驗(yàn)證Ticket(票證)來授予對(duì)CAS客戶端的訪問權(quán)限。CAS服務(wù)器需要獨(dú)立部署。
CAS客戶端:CAS客戶端通常來說就是指通過協(xié)議與CAS服務(wù)器進(jìn)行通信的任何CAS支持的應(yīng)用程序。CAS提供了一個(gè)軟件包,可以與各種軟件平臺(tái)和應(yīng)用程序集成,以便通過某種身份驗(yàn)證協(xié)議(如CAS,SAML,OAuth)與CAS服務(wù)器進(jìn)行通信,比如Java平臺(tái)的Java Cas Client、.NET平臺(tái)的.NET CAS Client、Python的pycas等等[5]。CAS客戶端與受保護(hù)的客戶端應(yīng)用集成部署到一起。
CAS的認(rèn)證核心就是票據(jù)(Ticket)。CAS的主要Ticket[6]有TGT、ST、PGT、GPTIOU、PT,其中TGT、ST是配電網(wǎng)數(shù)據(jù)管控平臺(tái)應(yīng)用中主要應(yīng)用的票據(jù),PGT、PGTIOU、PT是CAS2.0代理模式協(xié)議中用到的票據(jù),這里不做說明。
當(dāng)用戶開始對(duì)CAS客戶端(應(yīng)用程序)某個(gè)資源進(jìn)行訪問時(shí),CAS客戶端判斷當(dāng)前是否進(jìn)行過身份認(rèn)證,如果沒有經(jīng)過認(rèn)證,則會(huì)重定向到CAS服務(wù)器進(jìn)行認(rèn)證,客戶端以過濾器的方式來實(shí)現(xiàn)這個(gè)過程。CAS服務(wù)器返回給瀏覽器一個(gè)登錄認(rèn)證頁(yè)面,用戶填寫正確的信息提交給CAS服務(wù)器,CAS服務(wù)器認(rèn)證成功后,會(huì)在服務(wù)器生成一個(gè)票據(jù)TGT(Ticket Granting Ticket),并且將這個(gè)TGT存放在服務(wù)器緩存,不僅如此,服務(wù)器還會(huì)在用戶的瀏覽器生成一個(gè)Cookie TGC(Ticket Granting Cookie),TGT的ID以Cookie的形式放在這個(gè)TGC中??梢哉fTGT是CAS認(rèn)證過程中最重要的票據(jù),擁有TGT用戶就可以證明自己在CAS服務(wù)器中成功登錄過,每個(gè)登錄成功會(huì)話都只保存一份TGT,并且在TGT中保存了當(dāng)前登錄用戶的信息。TGT的核心作用是為用戶簽發(fā)ST(Service Ticket),顧名思義,ST是CAS為用戶簽發(fā)的訪問某一服務(wù)的票據(jù)。如果用戶在登錄應(yīng)用A成功后,再次提出訪問應(yīng)用B的某項(xiàng)服務(wù)的請(qǐng)求,應(yīng)用B將請(qǐng)求再一次轉(zhuǎn)向CAS服務(wù)器,此時(shí)CAS服務(wù)器會(huì)識(shí)別出這次請(qǐng)求中攜帶了TGC中的值,然后CAS服務(wù)器會(huì)根據(jù)這個(gè)值從服務(wù)器緩存中提取TGT,TGT簽發(fā)ST并將ST返回給應(yīng)用B客戶端,B接收到ST后在后臺(tái)以特定協(xié)議再次發(fā)送給CAS服務(wù)器確認(rèn),服務(wù)器通過認(rèn)證之后將用戶信息返回給應(yīng)用B,應(yīng)用B通過瀏覽器將用戶請(qǐng)求的資源返回。上面應(yīng)用B跟CAS服務(wù)器之間的交互過程,對(duì)用戶來說是完全透明的,用戶在瀏覽器中看不到票據(jù)交互過程,對(duì)用戶來說只是看到了請(qǐng)求的頁(yè)面得以正確響應(yīng)而已。
CAS的傳輸協(xié)議使用HTTPS安全協(xié)議,保證了Cookie傳輸過程中的安全性,由于認(rèn)證過程中使用的Cookie對(duì)象TGC只是CAS認(rèn)證服務(wù)器端進(jìn)行過使用,所以使得Cookie的跨域問題得到了很好解決。
整個(gè)過程完整的時(shí)序流程[5]如圖2和圖3所示。
3 數(shù)據(jù)管控平臺(tái)Web系統(tǒng)的CAS應(yīng)用實(shí)現(xiàn)
配用電網(wǎng)數(shù)據(jù)管控平臺(tái)的Web子應(yīng)用使用Java語(yǔ)言進(jìn)行開發(fā),CAS提供了對(duì)Java語(yǔ)言的支持。對(duì)CAS的集成首先需要解決的是CAS服務(wù)器和CAS客戶端的集成。
CAS服務(wù)器是需要單獨(dú)部署的Web服務(wù)器,CAS提供了完整的服務(wù)器工程源碼,平臺(tái)根據(jù)需要修改了自己風(fēng)格的登錄頁(yè)。
CAS服務(wù)器的適配修改主要有兩個(gè)步驟來實(shí)現(xiàn):
(1)修改CAS服務(wù)器的用戶認(rèn)證過程,轉(zhuǎn)換為平臺(tái)認(rèn)證接口,由于在用戶登錄過程中,為了更好的保證數(shù)據(jù)傳輸時(shí)的安全性,Web應(yīng)用在前端對(duì)密碼使用了RSA加密,所以在接收到密碼的Action首先需要進(jìn)行密碼解密。
根據(jù)Webflow中的定義,服務(wù)器處理處理用戶提交的信息是在AuthenticationViaFormAction類的submit方法進(jìn)行,解密后,將用戶提交信息封裝成特定格式對(duì)象傳遞給認(rèn)證處理類。
CAS在Spring配置文件中定義了認(rèn)證管理器bean:authenticationManager,認(rèn)證管理器的屬性authenticationHandlers指定了認(rèn)證用戶的具體處理類,添加應(yīng)用自己的處理類XOAUsernamePasswordAuthenticationHandler實(shí)現(xiàn)父類方法,在方法內(nèi)根據(jù)平臺(tái)自己的認(rèn)證處理邏輯來進(jìn)行用戶認(rèn)證,如圖4所示。
(2)根據(jù)圖2、圖3流程圖知道,在CAS服務(wù)器通過serviceValidate服務(wù)校驗(yàn)完CAS客戶端的ST票據(jù)后,如果校驗(yàn)成功,需要向CAS客戶端返回一個(gè)XML格式的響應(yīng),響應(yīng)里包含當(dāng)前認(rèn)證
的用戶以及一些需要傳遞的自定義屬性。
CAS服務(wù)器實(shí)現(xiàn)該過程的類是ServiceValidateController,在handleRequestInternal方法中校驗(yàn)完成后,在casServiceValidationSuccess.jsp中定義了返回?cái)?shù)據(jù)的XML格式,應(yīng)用根據(jù)需要修改這個(gè)頁(yè)面文件就可以實(shí)現(xiàn)向客戶端返回?cái)?shù)據(jù)。
CAS客戶端是CAS提供的一套軟件包,將jar包放到Web應(yīng)用的classpath下,確保Web應(yīng)用可以引用到。
平臺(tái)Web應(yīng)用的安全訪問控制采用SpringSecurity實(shí)現(xiàn),CAS客戶端的適配修改內(nèi)容也主要參照CAS官方指導(dǎo)中與SpringSecurity的結(jié)合說明,一些細(xì)節(jié)配置不在此敘述,其中兩個(gè)較為關(guān)鍵的修改如下:
(1)未認(rèn)證的用戶請(qǐng)求Web應(yīng)用資源,經(jīng)過過濾器攔截后跳轉(zhuǎn)到CAS認(rèn)證服務(wù)器。在配用電網(wǎng)數(shù)據(jù)管控平臺(tái)運(yùn)行環(huán)境中,認(rèn)證服務(wù)器在啟動(dòng)時(shí)已經(jīng)向平臺(tái)的后臺(tái)XAgent代理模塊注冊(cè),CAS客戶端同樣運(yùn)行在平臺(tái)環(huán)境中,可以通過XAgent中注冊(cè)的認(rèn)證服務(wù)器名動(dòng)態(tài)獲取認(rèn)證服務(wù)器IP地址進(jìn)行跳轉(zhuǎn)。在調(diào)用解析認(rèn)證服務(wù)器地址接口時(shí),如果傳入原始Web應(yīng)用請(qǐng)求IP,XAgent可以根據(jù)傳入IP更準(zhǔn)確解析認(rèn)證服務(wù)器地址,這在認(rèn)證服務(wù)器是多IP服務(wù)器以及部署在內(nèi)網(wǎng)進(jìn)行了內(nèi)外網(wǎng)IP映射時(shí),解決跳轉(zhuǎn)認(rèn)證服務(wù)器地址不正確的問題。
(2)涉及到與認(rèn)證服務(wù)器交互的編碼過程都需要同上文一樣動(dòng)態(tài)解析認(rèn)證服務(wù)器地址,另外一個(gè)需要修改請(qǐng)求地址的位置是客戶端向認(rèn)證服務(wù)器發(fā)送serviceValidate請(qǐng)求,以校驗(yàn)客戶端ST的過程。CAS客戶端java庫(kù)使用Cas20ServiceTicketValidator類來發(fā)送該請(qǐng)求,在validate方法中解析認(rèn)證服務(wù)器地址,然后進(jìn)行轉(zhuǎn)發(fā)。
4 平臺(tái)混合架構(gòu)下的CAS擴(kuò)展方案
CAS只提供了Web應(yīng)用的單點(diǎn)登錄支持,配用電網(wǎng)數(shù)據(jù)管控平臺(tái)需要在C/S端的系統(tǒng)控制臺(tái)XFront打開瀏覽器并訪問某個(gè)Web應(yīng)用的資源。
CAS服務(wù)器的認(rèn)證流程全部定義在Spring Webflow的配置文件中,流程起始位置是在認(rèn)證服務(wù)器位置請(qǐng)求“/login”。創(chuàng)建一個(gè)為XFront認(rèn)證服務(wù)的流程xfrontcheck,在這個(gè)新工作流中,流程的起始位置是在認(rèn)證服務(wù)器位置請(qǐng)求“/xfrontcheck”。
由于沒有CAS客戶端與CAS認(rèn)證服務(wù)的交互過程,而且由于在XFront客戶端已經(jīng)完成了用戶的認(rèn)證過程,所以不再需要CAS認(rèn)證服務(wù)器常規(guī)的用戶名和密碼認(rèn)證過程。代替的是圖1所示,XFront將請(qǐng)求跳轉(zhuǎn)到認(rèn)證服務(wù)器,并且攜帶兩個(gè)參數(shù),一個(gè)是已經(jīng)由平臺(tái)認(rèn)證后簽發(fā)的ticket憑證字符串,另一個(gè)是認(rèn)證通過后請(qǐng)求的原始Web應(yīng)用資源地址串。這個(gè)請(qǐng)求串的示意樣式為:https://192.168.0.XXX:8043/xwebcas/xfrontcheck/?t=xxxxxxxxxx&s=https%3A%2F%2Fapp-a.example.com%2F,該請(qǐng)求在瀏覽器中傳遞,參數(shù)字符串需要進(jìn)行轉(zhuǎn)碼傳輸。在CAS服務(wù)器接收到上面請(qǐng)求后,獲取到ticket并調(diào)用平臺(tái)校驗(yàn)接口,平臺(tái)認(rèn)證該ticket有效之后,CAS認(rèn)證服務(wù)器認(rèn)為認(rèn)證成功,繼續(xù)生成TGC、TGT和簽發(fā)ST的過程,這個(gè)過程就與之前的過程完全一致了。
5 結(jié)論
本文基于Apereo CAS框架,實(shí)現(xiàn)了電力系統(tǒng)中配用電網(wǎng)數(shù)據(jù)管控平臺(tái)的Web系統(tǒng)單點(diǎn)登錄,實(shí)現(xiàn)了應(yīng)用系統(tǒng)的統(tǒng)一管理,有效解決了用戶在多個(gè)應(yīng)用系統(tǒng)之間頻繁登錄的問題,提高了系統(tǒng)操作便利性和系統(tǒng)安全性。
另外,在此基礎(chǔ)上,對(duì)CAS的SSO認(rèn)證過程進(jìn)行了擴(kuò)展,改造了現(xiàn)有平臺(tái)認(rèn)證模式,在平臺(tái)認(rèn)證體系中增加用戶認(rèn)證憑證概念,并由此實(shí)現(xiàn)了C/S端跳向B/S端的統(tǒng)一認(rèn)證過程,擴(kuò)展了CAS框架的使用范圍,為之后的混合架構(gòu)下多端統(tǒng)一認(rèn)證研究提供了一種可參考范例。
參考文獻(xiàn):
[1]沈杰,朱程榮.基于Yale-CAS的單點(diǎn)登錄的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007,17(12):144-146+150.
[2]李建佳,王晶.基于JA-SIG CAS統(tǒng)一認(rèn)證平臺(tái)(SSO)的設(shè)計(jì)與實(shí)現(xiàn)[J].廣東海洋大學(xué)學(xué)報(bào),2013,33(03):78-83.
[3]施正曄.SSO單點(diǎn)登錄模型的優(yōu)化研究[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2012(S1):190-191.
[4]呼和,張欽,陳國(guó)青,楊旸.基于Web服務(wù)的企業(yè)統(tǒng)一認(rèn)證與授權(quán)系統(tǒng)[J].計(jì)算機(jī)應(yīng)用,2011,31(02):577-580.
[5]Aperea CAS.Enterprise Single Sign-On for All[DB/OL]. https://apereo.github.io/cas/4.2.x/index.html.
[6]王永.基于CAS和Shibboleth的單點(diǎn)登錄研究與設(shè)計(jì)[D].成都:電子科技大學(xué),2011.