摘要:為解決傳統認證機制所存在的問題提出了一種基于Cookie的跨域單點登錄系統,它利用HTTP重定向和方便的Cookie認證為基礎,以動態腳本載入實現Cookie的跨域共享,從而實現多應用系統環境下的用戶單點登錄。此系統的提出能夠解決跨域的統一身份認證問題,方便用戶對資源的使用、增強站點的穩定性和安全性。
關鍵詞:單點登錄;身份認證;Cookie
中圖分類號:TP311.5 文獻標識碼:A文章編號:1009-3044(2009)33-9146-03
Design of Cross-domain Single Sign-on System Based on Cookie
WEN De-min1, MEN Ai-dong1, WEN Ai-ping2
(1.Beijing University of Posts and Telecommunications, Beijing 100876, China; 2.Marine Hydrometeorological Center, South China Sea Fleet, Zhanjiang 524000, China)
Abstract: To resolve the problems of traditional authentication, a cross-domain single sign-on system based on Cookie is introduced. It is based on HTTP redirection and convenient Cookie authentication, and implements the Cookie's sharing of cross-domain supported by dynamic script loading to achieve single sign-on under the multi-application system environment. The system proposed can solve the problems of cross-domain uniform identity authentication, and makes it more convenient to use resources, enhances stability and security of websites.
Key words: single sign-on (SSO); identity authentication; cookie
1 概述
隨著信息技術和網絡的發展,企業信息化建設已經進入了快速發展的階段。目前,大多數組織內部存在著大量不同的應用系統,如人事系統、辦公系統、財務系統及各種對內對外的網站。為了實現對所管理資源的訪問控制,大部分系統都采用基于用戶名/口令的認證方式,只有被授權的用戶才能訪問受控資源。每個應用系統都擁有獨立的身份認證機制,在進入不同系統時都要重新提交用戶名和口令來通過系統的認證,這種分散式用戶身份認證機制會導致以下后果:1) 用戶需要設置大量的用戶名和密碼,容易混淆。2) 用戶為了方便,往往會選擇簡單信息作為口令或者設置相同的口令,這樣將會帶來巨大的安全隱患。3) 對管理者而言,需要創建多個用戶數據庫,管理繁瑣。
鑒于此,單點登錄(Single Sign-On, SSO)技術應運而生。它是一套身份認證機制,用來實施在多個獨立的應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的Web應用系統,系統間切換時無需再次登錄認證,即“一次登錄,多方認證”。單點登錄系統把原來分散的用戶管理集中起來,各系統之間依靠相互信賴的關系來進行用戶身份的自動認證。由于用戶的信息是集中保存和管理的,管理員只需在一個統一的用戶信息數據庫中添加、刪除用戶賬號,不必在多個系統中分別設置用戶信息數據庫,從而避免了應用系統的重復開發和數據同步更新問題,便于系統之間的資源共享,增強了用戶體驗。該文簡述了Cookie的組成和跨域使用方法,提出了一種方便有效的單點登錄解決方案,它采用集中式架構,以跨域Cookie共享為核心來完成用戶的登錄認證。
2 Cookie概述
2.1 Cookie的定義與功能
Cookie是當用戶瀏覽網站時,服務器發送給瀏覽器的純文本信息,它保存在客戶機上的一個小文本文件,記錄了用戶ID、密碼、瀏覽過的網頁、停留的時間等信息,用戶以后訪問同一個Web服務器時瀏覽器會把它們原樣發送給服務器。通過讓服務器讀取它原先保存到客戶端的信息,網站能夠為瀏覽者提供一系列的方便服務,如在線交易過程中標識用戶身份、安全要求不高的場合避免用戶重復輸入名字和密碼、門戶網站的主頁定制、有針對性地投放廣告等等。目前,Cookie已廣泛應用于Web應用中,如Microsoft的 Passport單點登錄服務就是借助于Cookie完成的。
2.2 Cookie的組成和使用
Cookie的基本格式如下:
Name=VALUE; Expires=DATE; Path=PATH; Domain=DOMAIN_NAME
Cookie由變量名和值組成,如\"Name=VALUE\",Name是該Cookie的名稱,VALUE是該Cookie的值。其屬性里既有標準的Cookie屬性,也可以有用戶自定義屬性,屬性中變量也是用“變量=值”形式來保存。其中各項以“,”分開。
Cookie具有以下幾種屬性:
1) Expires屬性:此屬性用來給Cookie設置一個期限,在期限內只要打開網頁就可以調用被保存的Cookie,如果過了此期限Cookie就自動被刪除。如:設定Cookie的有效期到2010年1月1日,到時將自動刪除。如果一個Cookie沒有設定有效期,則其生命周期從打開瀏覽器開始,到關閉瀏覽器結束,每次運行后生命周期將結束,下次運行將重新開始。
2) Domain屬性:這個屬性定義了Cookie傳送數據的唯一性,即只有來自這個域的頁面才可以使用Cookie中的信息。缺省時,默認屬性為該Web服務器的域名。
3) Path屬性:Path定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的Cookie。如果Path屬性的值為“/”,則Web服務器上所有的WWW資源均可讀取該Cookie。缺省時,Path的屬性值為Web服務器傳給瀏覽器的資源的路徑名。借助對Domain和Path兩個變量的設置,即可有效地控制Cookie文件被訪問的范圍。
4) Secure屬性:指定Cookie能否被用戶讀取。
5) Haskeys屬性:如果所請求的Cookie是一個具有多個鍵值的Cookie字典,則返回True,它是一個只讀屬性。
當用戶用瀏覽器首次訪問某Web站點(Web服務器)時,服務器端在響應(Response)中創建一個Cookie,并將其寫入訪問者的計算機。
當用戶再次訪問此Web站點時,瀏覽器在它的請求(Request)中包含這個已經創建的Cookie,并且將它返回至服務器,從而完成瀏覽器的認證。
2.3 Cookie的跨域使用
Cookie分為第一方Cookie和第三方Cookie。第一方Cookie,又叫Session Cookie,是指來自或發送到當前正在瀏覽的網站的Cookie。第三方Cookie,又叫本地Cookie,是指來自或發送到當前正在瀏覽的網站以外的網站的Cookie。
在默認安全級別下,IE要求iframe、img等標簽只發送Session Cookie,攔截本地Cookie發送。如果這些標簽跨域引用一個頁面時返回的HTTP響應頭中包含Cookie,那么IE無法正常存取HTTP響應中的Cookie。例如,有www.a.com與www.b.com兩個域(簡稱A域與B域)。在B域有一個頁面test.html,包含指向A域的iframe:,A域中的test.php是一個對A域設置Cookie的頁面。當請求http://www.b.com/test.html時,iframe跨域請求www.a.com/test.php,test.php會嘗試Set-cookie第一次請求,此時瀏覽器接收到一個Cookie。如果設置Cookie成功,IE再次請求該頁面時,由于跨域限制,iframe無法正常發送接收到的Cookie。
為解決Cookie的跨域訪問問題,需要應用P3P技術。P3P(Platform for Privacy Preferences)是萬維網聯盟(W3C)公布的一項隱私保護推薦標準,旨在為網上沖浪的Internet用戶提供隱私保護。訪問支持P3P的網站的用戶有權查看站點隱私策略,然后決定是否接受Cookie或是否使用該網站。
在響應頭中設置P3P Header可以允許跨域訪問隱私數據,從而可以跨域設置Cookie。修改上文中的www.a.com/test.php添加 php header(\"P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\") ?>。再次訪問http://www.b.com/test.html時,IE就可以成功收發A域的Cookie。
3 系統設計
3.1 系統構成
1) Web瀏覽器。用戶通過IE等Web瀏覽器發送資源請求并接收應用服務器的響應。當用戶登錄時,IE提交的表單里含有用戶名和密碼,登錄成功后瀏覽器接收服務器傳回的Cookie保存在本地客戶端機器上,并在其后的每次請求中攜帶Cookie信息用以身份認證。
2) 應用服務器。判斷用戶是否登錄并向用戶提供各種資源,包括網頁、文件、圖片等。當用戶請求資源時,應用服務器負責檢查用戶請求中是否攜帶Cookie信息、攜帶的信息是否有效。當用戶登錄時,應用服務器負責將用戶信息轉發給認證中心服務器完成認證。
3) 認證中心服務器。它負責存儲所有應用程序的用戶信息,利用數據庫信息驗證用戶提交的用戶名和口令。同時,認證中心服務器還負責存儲所有應用服務器的信息,用以獲取可以生成某一個應用的Cookie的鏈接。認證服務的安全性也通過認證中心存儲的密鑰來保證。
3.2 基于Cookie的認證過程
基于Cookie的跨域單點登錄系統的認證主要包括兩部分的交互過程。一是Web瀏覽器和應用服務器的交互,二是應用服務器和認證中心服務器的交互,Web瀏覽器不和認證中心服務器直接交互。圖1表示的是系統的認證過程:用戶首先在未登錄的狀態下訪問應用1的資源,登錄成功后訪問應用2的資源。實線代表的是用戶(Web瀏覽器)和應用服務器的交互過程,虛線代表的是應用服務器和認證中心服務器的交互過程。其中應用1和應用2位于不同的域中。
流程圖中的主要過程的描述如下:
1) 用戶通過瀏覽器請求應用1的保護資源,如某一個網頁。
2) 應用1服務器接收到請求后,分析請求的Header,檢查其中的Cookie信息。
3) 用戶第一次訪問應用1,所以請求中無Cookie信息,應用1重定向到登錄頁面,返回給瀏覽器。
4) 用戶在瀏覽器登錄頁面填寫完用戶名和密碼后提交表單,應用1服務器接收到表單后,提取出用戶名和口令信息。
5) 應用1將用戶名和口令及應用1信息(如應用ID,時間戳、交互類型等)加密后提交到認證中心服務器。
6) 認證中心服務器接收到應用1的請求后,利用解密密鑰將用戶信息和應用信息提取出來,然后根據數據庫中存儲的用戶信息判斷用戶名和密碼在應用1中是否有效。認證成功后,認證中心服務器完成第二個功能:根據存儲的應用1和應用2的信息,為兩個應用各生成一個特殊的鏈接地址。如果用戶在瀏覽器中訪問這個鏈接,相應的應用服務器會在響應中添加Cookie信息供瀏覽器保存和使用。
7) 認證服務器將生成的兩個鏈接地址分別添加到的字符串后返回給應用1服務器。
8) 應用1將含有鏈接地址的