
摘 要:不同的信息系統為保證安全性,須用戶重復輸入用戶名和密碼進行驗證。上述操作過程繁瑣,浪費時間,嚴重影響用戶體驗。而單點登錄技術通過“一次登錄,多方認證”的方案可解決多系統重復驗證的問題。文章介紹了單點登錄的定義、分類標準,通過利用Cookie的特性設計了基于Cookie的同域單點登錄的實現方案和實現流程,并以同域單點登錄為具體案例編寫代碼實現了該功能,最后就基于Cookie同域單點登錄的實現方案中存在的安全隱患進行了討論,并針對性地提出了具體的改進措施。文章從方案的設計以及方案的實現都做了相應的論證,因此具有一定的參考價值。
關鍵詞:Cookie;單點登錄;同域登錄
1 概述
隨著信息時代的來臨,多重樣式的信息系統解決了用戶的信息資源問題,提高了個人和企業的效率。信息系統確保用戶信息資源的隱私,依賴登錄認證流程。即,只有用戶名和密碼等通過信息系統的認證流程,用戶才能合法訪問系統管理的信息資源。但是,不同的信息系統具有獨立的登錄認證系統。因此,面對不同的信息系統,用戶必須多次輸入驗證信息,重復執行驗證過程。上述過程操作繁瑣,影響用戶體驗。如何在保證用戶信息安全的情況下,降低驗證次數,達到一次登錄,多系統免登錄合法使用是面臨的問題。單點登錄技術解決了上述問題。
所謂單點登錄,簡稱為SSO,即Single Sign On,具體含義是指在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統,通過單點登錄,用戶能實現“一次登錄,多方認證”。單點登錄具有多種分類標準:(1)按相互信任系統的訪問地址區分為同域單點登錄、同父域單點登錄以及跨域單點登錄;(2)按實現單點登錄的技術分為基于LTPA、基于表單以及基于Cookie。
因為基于LTPA單點登錄只能適用于IBM系列產品,具有一定的局限性,而基于Cookie的單點登錄具有集成度較好、實現簡單、容易擴展,支持分布式部署、支持跨平臺等優點。因此本文就討論基于Cookie的同域單點登錄的設計與實現。
2 Cookie概述
Cookie是客戶端瀏覽器訪問服務器數據時,服務器保存在客戶端的一段文本信息,主要是用于對客戶端信息進行標記,從而區分不同的客戶端瀏覽器。
Cookie采取健、值的形式保存。主要的屬性有Cookie名稱、Cookie有效期、域名、路徑等。Cookie的有效期指明Cookie存在的期限;而域名則明確了獲取Cookie的Internet域;路徑定義獲取Cookie的路徑范圍。本文特別要提到的是域名屬性以及路徑屬性,因為這兩個屬性是單點登錄的關鍵。舉個例子,假設有兩個信息系統的服務器地址分別是http://domain1.com.cn、http://domain2.com.cn。根據單點登錄的定義可知,上述兩個主頁能實現“一次登錄,多次認證”的關鍵是,上述兩個地址都能獲取共享的Cookie信息。而Cookie的域名屬性和路徑屬性就決定了訪問Cookie的地址范圍。因此,改變Cookie域名屬性和路徑屬性,則可能導致服務器無法獲取Cookie,從而影響認證過程??傊蛎麑傩院吐窂綄傩詫吸c登錄而言,非常重要。
Cookie的域名屬性用Domain表示,Cookie的路徑屬性用Path表示。具體而言,假設新建Cookie的名字為NewCookie,則NewCookie.Domain=“.com.cn”,NewCookie.Path=“/”,表示com.cn域下所有的路徑都可以訪問NewCookie。
3 單點登錄的流程
單點登錄的流程如下:當用戶登錄系統時,服務器認證中心將遍歷用戶客戶端所有的Cookie,判斷是否存在與認證中心一致的Cookie。如果存在,則跳過登錄過程,直接跳轉到系統主頁;否則跳轉到登錄頁面。用戶在登錄頁面輸入用戶名、密碼等信息后,服務器驗證登錄信息是否符合要求,如果符合,則創建Cookie,標記登錄信息,跳轉主頁。否則提示登錄信息錯誤,重新登錄。具體如圖1所示。
4 實現方案
單點登錄系統由三部分構成:
(1)Web瀏覽器客戶端。用戶通過Web瀏覽器發送訪問服務器資源的請求,存儲Cookie,用戶通過Web瀏覽器通過表單提交用戶名、密碼等登錄信息到應用服務器驗證,接收應用服務器的反饋。
(2)應用服務器。存儲用戶訪問的數據資源、用戶名、密碼,驗證用戶提出的登錄信息是否合法,并跳轉頁面發送至瀏覽器。
(3)認證中心服務器。存儲Cookie信息,獲取Cookie,驗證Cookie的有效性。
本文在SSH框架基礎上實現同域單點登錄,具體代碼如下:
后臺驗證用戶名和密碼的類:
public class SSOAction extends ActionSupport{
public String doLogin(){
boolean ok = SSOCheck.checkLogin(username,password)
if( ok ){
Cookie cookie = new Cookie(“ssocookie”,“sso”);
cookie.setPath(“/”);
HttpServletResponse response = ServeltActionContext.getResponse();
response.addCookie(cookie);
return SUCCESS;
}
}
}
public class SSOCheck{
public static final String USERNAME=“user”;
public static final String PASSWORD=“123”;
//檢查用戶名和密碼的正確性
public static boolean checkLogin(String username,String password){
if( username.equals(USERNAME) && passsword.equals(PASSWORD) ){
return true;
}
return false;
}
//驗證Cookie的有效性
public static bookean checkCookie(HttpServeltRequest request){
Cookie[] cookie = request.getCookies();
if( cookie != null ){
for(Cookie cookie:cookies){
if( cookie.getName.equals(“ssocookie”)
&& cookie.getValue().equals(“sso”)){
return true;
}
}
}
return false;
}
}
5 Cookie安全性分析
根據前幾節的分析,單點登錄的關鍵是Cookie的驗證。但是客戶端保存的Cookie是一段文本??蛻舳藢ζ鋬热菀约霸L問權限并未加以限制,因此Cookie存在一定的安全隱患。例如,當用戶成功登錄應用服務器后,其他用戶來使用該客戶端。因為先前用戶登錄后,保存有合法的Cookie,則后來用戶無需登錄也可以成功訪問其他被信任的系統。此外,保存在客戶端的Cookie,保存的路徑不具有隱蔽性和訪問限制,并且Cookie內容是以明文的保存,這些特點導致Cookie信息非常容易被非法用戶竊取,從而利用竊取的Cookie通過認證,非法進入系統主頁。
解決上述安全隱患的辦法如下:(1)多用戶訪問客戶端;(2)對Cookie信息進行加密保護。
參考文獻
[1]劉潤達,諸云強,宋佳,等.一種簡單跨域單點登錄系統的實現[J].計算機應用,2007,2(27):288-291.
[2]沈海波,洪帆.基于Cookie的跨域單點登錄認證機制分析[J].計算機應用與軟件,2006,12(23):48-51.
[3]趙晉,楊旭董.基于CAS的單點登錄系統的研究與實現[J].軟件,2016,37(11):118-124.
[4]SM2算法對基于cookie的跨域單點登錄的優化方案[J].集寧師范學院學報,2016,38(5):41-43.
[5]王國偉,薛曼君.基于票據的跨域單點登錄[J].計算機應用,
2012,32(6):1766-1768.
[6]董亮衛,汪文勇,黃鸝聲.支持單點登錄的統一資源管理體系研究[J].計算機應用,2006,26(5):1146-1147.
作者簡介:戚利娜(1981-),女,湖南邵陽人,學歷:本科,吉首大學張家界學院理工農學部講師,研究方向:計算機應用技術。