1 單點登錄的定義
單點登錄(Single Sign On),簡稱為SSO。是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。SSO的定義是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。它是企業(yè)應(yīng)用集成在。身份認(rèn)證”層面的整合。
2 B/S架構(gòu)的單點登錄原理
本文基于B/S架構(gòu)來討論單點登錄技術(shù),如圖1所示。
當(dāng)用戶第一次訪問應(yīng)用系統(tǒng)1的時候,因為還沒有登錄,會被引導(dǎo)至認(rèn)證系統(tǒng)中進(jìn)行登錄(1);根據(jù)用戶提供的登錄信息,認(rèn)證系統(tǒng)進(jìn)行身份驗證,如果通過驗證。應(yīng)該返回給用戶一個認(rèn)證的票據(jù)principal(2):用戶再訪問別的應(yīng)用的時候(3,5)就會將這個血k毗帶上.作為自己認(rèn)證的依據(jù),應(yīng)用系統(tǒng)接受到請求之后會把ticket送到認(rèn)證系統(tǒng)進(jìn)行驗證,檢查principal的合法性(4,6)。如果通過驗證。用戶就可以在不用再次登錄的情況下訪問應(yīng)用系統(tǒng)2和應(yīng)用系統(tǒng)3了。
圖1單點登陸示意圖
從圖1可以看出,要實現(xiàn)SSO,需要以下主要的功能:
①所有應(yīng)用系統(tǒng)共享一個身份認(rèn)證模塊。統(tǒng)一認(rèn)證是SSO的前提之一。認(rèn)證的主要功能是將用戶的登錄信息和用戶信息庫相比較,對用戶進(jìn)行登錄認(rèn)證;認(rèn)證成功后,認(rèn)證應(yīng)該生成統(tǒng)一的認(rèn)證票據(jù)(principal),返還給用戶。另外,認(rèn)證還應(yīng)該對principal進(jìn)行驗證,判斷其有效性。
②所有應(yīng)用系統(tǒng)能夠識別和提取principal信息。要實現(xiàn)SS0的功能,讓用戶只登錄一次,就必須讓應(yīng)用系統(tǒng)能夠識別已經(jīng)登錄過的用戶。應(yīng)用系統(tǒng)應(yīng)該能對principal進(jìn)行識別和提取,通過與認(rèn)證模塊的通訊,能自動判斷當(dāng)前用戶是否登錄過,從而完成單點登錄的功能。
3 單點登錄實現(xiàn)方案
實現(xiàn)單點登錄通常有以下幾種常見的方案:
3.1 SSO商業(yè)軟件:如Netgrity的Siteminder。Novell公司的iChain,RSA公司的ClearTrust等,這些商業(yè)軟件一般適用于客戶對SSO的需求很高,并且企業(yè)內(nèi)部采用COTS軟件如:Domino,SAP,Sieble的系統(tǒng)比較多的情況下采用。并結(jié)合身份管理。統(tǒng)一認(rèn)證等項且采用。采用這些軟件一般都要對要集成的系統(tǒng)做些改造,如在要集成的系統(tǒng)上安裝AGENT。
3.2基于COOKIE的方案將認(rèn)證信息以COOKIE的形式存儲在客戶端,在同一域中應(yīng)用系統(tǒng)共享此認(rèn)證信息。這種方案不能跨域,但可以通過變通的技巧實現(xiàn)跨域。由于要在客戶端存儲登錄信息,并在網(wǎng)絡(luò)中傳輸,應(yīng)對登錄信息進(jìn)行加密。基于COOKIE實現(xiàn)單點登錄的關(guān)鍵是同一主域名下的多個應(yīng)用可以共享COOKIE。假設(shè)應(yīng)用系統(tǒng)A部署在a.domain.corn,B部署在b.domain.com(A和B的主域名都是domain.corn)如果設(shè)cookie的時候,設(shè)置domain為domain.com,那在A、B上都可以訪問到這個cookie了。當(dāng)A和B的主域名不一致時,A和B不能共享COOKIE,單點登錄將失敗,本文后續(xù)將詳細(xì)介紹解決方案。
3.3基于令牌(TOKEN)傳遞的方式以耶魯大學(xué)的CAS項目為基礎(chǔ),由CAS執(zhí)行授權(quán),用戶名和密碼不會通過網(wǎng)絡(luò)在應(yīng)用系統(tǒng)間傳播,增加了安全性。
3.4 USBKey登錄每個使用該系統(tǒng)的用戶都有一個USBKey證書,這種證書是一個帶智能芯片、形狀類似于U盤的硬件設(shè)備,在登陸系統(tǒng)的時候把這個證書插在計算機(jī)上。每一個網(wǎng)站都要通過這個證書去認(rèn)證。這樣每個登錄用戶只需插上USBKey即可進(jìn)入受信任系統(tǒng),當(dāng)然訪問USBKey首先需要密碼校驗。
4 基于Cookie的解決方案
假設(shè)一個場景:一個用戶還沒有在任何一個系統(tǒng)中登錄。他想訪問部署到AppServer1上的應(yīng)用,于是他打開瀏覽器(Browser),在地址欄中輸入一個URL,并按回車,接下來發(fā)生的事情,在圖2中做了分解。
圖2 權(quán)限管理系統(tǒng)單點登陸框圖
4.1用戶首先訪問APPServer1的應(yīng)用,被APPServerl的AasWebFiher過濾囂攔截,過濾器通過用戶的請求對象取得Cookie中的票據(jù)信息,它要驗證一下用戶是否已經(jīng)登錄了。
4.2過濾器請求ClientService遠(yuǎn)程接口。驗證用戶的登錄狀態(tài)。
4.3為了驗證用戶的登錄狀態(tài)。ClientService遠(yuǎn)程接口請求部署在AASServer上的權(quán)限系統(tǒng)中AasSetrice服務(wù),AssService服務(wù)提供很多用戶認(rèn)證和授杈方面的服務(wù)。AasService服務(wù)檢查該用戶的票據(jù)信息,發(fā)現(xiàn)該用戶的票據(jù)信息不存在或已過期,說明該用戶沒有登錄過,于是返回一個未登錄的狀態(tài)給他的服務(wù)請求者。
4.4 AasWebFilter收到未登錄的狀態(tài),首先保存了用戶當(dāng)前的請求地址,然后將用戶重定向到登錄頁面,登錄頁面由權(quán)限系統(tǒng)提供。用戶輸入登錄信息,提交到權(quán)限系統(tǒng)。
4.5權(quán)限系統(tǒng)的AasWebFiher發(fā)現(xiàn)用戶請求登錄,于是不做權(quán)限檢查,直接交給Servlet來處理。
4.6 Servlet會請求AasService對用戶提交的信息進(jìn)行認(rèn)證。
4.7如果用戶認(rèn)證成功,權(quán)限系統(tǒng)生成合法的票據(jù)返回給瀏覽器,瀏覽器將其保存在Cookie中,并重定向到用戶登錄前請求的頁面,AasWebFiher收到這個頁面的請求,會再做一遍第二步和第三步流程,確認(rèn)用戶是合法的,于是將請求轉(zhuǎn)交給Servlet處理。
4.8 Servlet委托AppModule處理請求。AppModule相當(dāng)于Struts Action。
4.9 AppModule泛指應(yīng)用系統(tǒng)中的功能模塊,負(fù)責(zé)處理用戶提交的請求。
4.10由于業(yè)務(wù)的需要,用戶想登錄到APPServer2上的應(yīng)用程序,于是在瀏覽器中輸入APPServer2的地址,瀏覽器將此前登錄后Cookie中的票據(jù)信息一并提交到APPServer2。
4.11 AasWebFilter同樣委托ClientService驗證用戶的信息,得知用戶曾在其他系統(tǒng)中登錄,屬于合法用戶,于是將請求轉(zhuǎn)發(fā)給Servlet處理。
4.12 Servlet調(diào)用特定的AppModule處理請求有一個細(xì)節(jié),在第十步中,瀏覽器將AASServer設(shè)置的Cookie提交到APPServer2的域上,這是不可能實現(xiàn)的,因為同一Cookie不能在多個域中共享使用,本文在下一小節(jié)中將解決Cookie跨域問題。
5 解決Cookie跨域的問題
在上一小節(jié)中,本文提出了Cookie跨域問題,為什么會存在這樣一個問題呢7因為瀏覽器都具有隱私策略的設(shè)定:不允許跨域共享Cookie。由于Cookie會保存一些用戶的敏感信息,如用戶名、密碼、銀行賬號等,處于安全與隱私的考慮,通常瀏覽器只允許本域設(shè)置的Cookie本域可以訪問,其他域里的應(yīng)用無法獲得這些Cookie,瀏覽器會根據(jù)Cookie的名字判斷Cookie所屬的域。
舉一個例子:現(xiàn)在有兩臺服務(wù)器(兩個域)。每臺服務(wù)器上部署了一個WEB應(yīng)用,用戶訪問A服務(wù)器上的應(yīng)用app1時。app1的程序可以設(shè)置myCookie=1,同樣。用戶訪問B服務(wù)器上的應(yīng)用app2時,app2的程序也可以設(shè)置同名的myCookie=2,那么這時,app1讀取到的myCookie的值是什么呢?答案是1。同樣,app2讀取的myCookie的值是2,這說明,瀏覽器在向appl提交請求時。只會將appl所設(shè)置的Cookie封裝到請求中,而不會將其他域設(shè)置的Cookie封裝進(jìn)請求。瀏覽器是分域來保存各個系統(tǒng)設(shè)置的Cookie信息的,幾乎所有的瀏覽器都遵循這一事實。
用戶登錄后的票據(jù)信息保存在權(quán)限系統(tǒng)所設(shè)置(對應(yīng)圖中AASServer)的Cookie中。用戶訪問其他服務(wù)器上的應(yīng)用時,不會將權(quán)限系統(tǒng)設(shè)置的票據(jù)信息提交,那么系統(tǒng)就無法判斷用戶是否在其他域中已經(jīng)登錄了(判斷是否登錄的依據(jù)就是,用戶在權(quán)限系統(tǒng)所在的域中是否設(shè)置了票據(jù)的Cookie),繼而單點登錄也就失效了。
為了實現(xiàn)單點登錄功能,需要使各個業(yè)務(wù)系統(tǒng)設(shè)置一個包含票據(jù)信息的Cookie,使業(yè)務(wù)系統(tǒng)都擁有本域的票據(jù)信息。由于用戶總是要通過權(quán)限系統(tǒng)登錄,因此,可以在權(quán)限系統(tǒng)中設(shè)置票據(jù)信息的Cookie。用戶在訪問其他業(yè)務(wù)系統(tǒng)時,首先重定向到權(quán)限系統(tǒng),檢查權(quán)限系統(tǒng)中是否設(shè)置過Cookie,如果設(shè)置過Cookie,那么說明用戶在權(quán)限系統(tǒng)中是登錄成功的狀態(tài),只要將帶有票據(jù)信息的請求重定向到業(yè)務(wù)系統(tǒng),由業(yè)務(wù)系統(tǒng)設(shè)置所在域的票據(jù)Cookie。這樣在業(yè)務(wù)系統(tǒng)的域中也有票據(jù)Cookie存在了。
核心關(guān)注:拓步ERP系統(tǒng)平臺是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://m.hanmeixuan.com/
本文標(biāo)題:基于Cookie的單點登錄實現(xiàn)
本文網(wǎng)址:http://m.hanmeixuan.com/html/support/1112158073.html