林偉明
〔摘 要〕為了解決圖書館各個服務(wù)系統(tǒng)的統(tǒng)一認證問題,提出了基于Jasig CAS實現(xiàn)統(tǒng)一身份認證的解決方案,并對其中所涉及的關(guān)鍵技術(shù)進行了描述。利用該方案,實現(xiàn)了深圳大學(xué)圖書館統(tǒng)一身份認證,為需要實現(xiàn)統(tǒng)一認證的其他圖書館提供了參考。
〔關(guān)鍵詞〕統(tǒng)一身份認證;CAS;圖書館
〔中圖分類號〕TP391 〔文獻標識碼〕B 〔文章編號〕1008-0821(2012)09-0134-05
近年來,隨著圖書館數(shù)字化建設(shè)的不斷推進,越來越多基于Web的服務(wù)系統(tǒng)為圖書館提供服務(wù)支撐。如聯(lián)機公共目錄查詢系統(tǒng)OPAC、圖書館門戶網(wǎng)站、校外遠程訪問系統(tǒng)EZProxy[1]、下一代互聯(lián)網(wǎng)校園學(xué)習(xí)生活交流平臺CARSI Portal[2-3]、CALIS中心的應(yīng)用系統(tǒng)[4]、讀者問卷調(diào)查系統(tǒng)等。這些服務(wù)系統(tǒng)都有自己一套獨立的身份認證機制,所使用的技術(shù)架構(gòu)也不盡相同,這樣導(dǎo)致用戶在使用這些系統(tǒng)時都需要輸入用戶賬號和密碼信息,加大了認證復(fù)雜度,降低了圖書館服務(wù)的易用性。
單點登錄,指的是用戶登錄一次后,可以訪問所有互相信任的應(yīng)用系統(tǒng)而不再需要身份驗證。單點登錄可以降低認證復(fù)雜度,方便用戶使用圖書館的服務(wù),提高了圖書館資源的共享率。因此如何實現(xiàn)統(tǒng)一身份認證已成為圖書館亟待解決的重要問題之一。
1 需求及技術(shù)思路
目前,深圳大學(xué)圖書館為讀者提供了OPAC、門戶網(wǎng)站、期刊電子資源瀏覽下載、CARSI Portal、CALIS“E讀”、CALIS館際互借與文獻傳遞、深圳文獻港[5]等服務(wù)。這些服務(wù)所使用的開發(fā)技術(shù)不盡相同,其中OPAC是采用ASP.NET技術(shù)自主研發(fā)的;門戶網(wǎng)站是采用SupeSite(一款由Discuz開發(fā)的PHP+MySql的內(nèi)容管理系統(tǒng)平臺)進行管理;期刊電子資源瀏覽下載的校外服務(wù),本館采用了目前被國外廣泛使用的實現(xiàn)校外訪問代理軟件EZProxy;CARSI Portal是由北京大學(xué)發(fā)起的采用Java技術(shù)解決聯(lián)盟內(nèi)部進行高校資源共享問題的門戶;CALIS“E讀”、CALIS館際互借與文獻傳遞是CALIS(中國高等教育文獻保障系統(tǒng))提供的服務(wù);深圳文獻港的開發(fā)技術(shù)是Java。
這些服務(wù)都有各自的應(yīng)用系統(tǒng)來支撐,而且具有相對獨立的身份認證模式。因此本館需要統(tǒng)一認證方案,來解決用戶單點登錄問題。
在國內(nèi),一些教育機構(gòu)使用Jasig CAS[6]來解決統(tǒng)一認證問題。如國家科學(xué)圖書館[7],北京郵電大學(xué)圖書館[8],浙江林學(xué)院數(shù)字化校園[9],國家科技基礎(chǔ)條件平臺專項資助的地球系統(tǒng)科學(xué)數(shù)據(jù)共享網(wǎng)[10]。劉峰等基于CAS解決門戶單點登陸問題,并提出支持單點退出的改進方案[11]。宋春麗等基于CAS與Web服務(wù)對遺留系統(tǒng)進行集成[12]。
國外的一些軟件產(chǎn)品[13]如uPortal、Liferay portal、Kuali Workflow、Kuali Notification等集成了CAS客戶端,用戶在使用這些產(chǎn)品時可以輕松地接入基于CAS的統(tǒng)一認證平臺。
因此,本館擬采用CAS來實現(xiàn)統(tǒng)一身份認證平臺。解決思路如下:基于CAS服務(wù)器端技術(shù),搭建認證服務(wù)平臺,同時該平臺需要能與本校的一卡通認證方式接入;研究CAS客戶端技術(shù),為OPAC、門戶網(wǎng)站等加入CAS客戶端;研究EZProxy、CARSI Portal、CALIS“E讀”、CALIS館際互借與文獻傳遞、深圳文獻港等接入CAS認證平臺的問題。
2 基于CAS的統(tǒng)一認證方案
Jasig是一個由教育機構(gòu)和為高等教育貢獻開源軟件項目的商業(yè)公司組成的聯(lián)盟。CAS(Central Authentication Service)是由Yale大學(xué)發(fā)起的一個開源項目,在2004年正式成為Jasig的一個項目。該項目針對應(yīng)用系統(tǒng)提供了一套安全可靠的企業(yè)級單點登錄解決方案。
CAS分為服務(wù)器端Server和客戶端Client兩部分。CAS Server需要獨立部署,主要負責進行用戶身份認證;CAS Client則負責處理對受保護資源的訪問請求,當需要用戶進行登錄時,重定向到CAS Server。圖1展示了CAS認證過程。
首先用戶通過Web瀏覽器訪問所需的受保護Web應(yīng)用;該Web應(yīng)用通過內(nèi)嵌的CAS客戶端把請求轉(zhuǎn)向CAS服務(wù)端;CAS服務(wù)端判斷用戶是否已經(jīng)登錄,如果沒有則打開認證界面供用戶進行身份驗證;認證通過后,CAS服務(wù)端向Web應(yīng)用傳輸生成的票據(jù)(Ticket);CAS客戶端把取得的票據(jù)向CAS服務(wù)端請求驗證票據(jù);驗證通過后,Web應(yīng)用可以通過CAS客戶端向服務(wù)端取得認證通過的用戶ID,并向用戶提供其所請求的服務(wù)。
從圖1可以看出,CAS的核心就是其票據(jù)以及在票據(jù)上的一系列處理。
CAS Server支持多種不同類型的認證方式,如數(shù)據(jù)庫認證方式、微軟的活動目錄方式(Active Directory)、輕量目錄訪問協(xié)議(LDAP)、X.509數(shù)字認證、Java驗證和授權(quán)API(JAAS)方式等。
CAS Client支持多種開發(fā)語言(如Java、ASP.NET、PHP等),方便開發(fā)者集成到應(yīng)用系統(tǒng)中。在官方網(wǎng)站上有針對每種語言的開發(fā)指南,并提供了相應(yīng)的例子作為參考。
本文選擇CAS來架設(shè)深圳大學(xué)圖書館統(tǒng)一認證服務(wù)平臺。平臺體系結(jié)構(gòu)如圖2。
平臺需要獨立架設(shè)一個CAS認證服務(wù)器,并提供HTTPS傳輸協(xié)議。該服務(wù)器的認證服務(wù)使用深圳大學(xué)校園卡中心提供的認證接口,支持校園卡方式登錄。在OPAC系統(tǒng)、門戶網(wǎng)站中,集成CAS Client,改造驗證模式。EZProxy、CARSI門戶的認證本身支持與CAS服務(wù)端接入,因此只需要根據(jù)相關(guān)資料進行配置。對于CALIS統(tǒng)一認證中心,需要開發(fā)CALIS認證接入API,并在其中集成CAS Client。在CAS認證服務(wù)器上,根據(jù)深圳文獻港認證接入文檔,為深圳文獻港的認證服務(wù)開發(fā)OPEN API。
CAS認證服務(wù)僅負責用戶身份驗證及圖書館服務(wù)使用權(quán)限的判斷,對于具體的各應(yīng)用系統(tǒng)中各模塊的權(quán)限設(shè)置,還是由各應(yīng)用系統(tǒng)負責。
2.1 統(tǒng)一認證平臺服務(wù)端的實現(xiàn)
深圳大學(xué)擁有校園一卡通系統(tǒng),因此圖書館的認證服務(wù)希望能讓用戶直接使用校園卡來進行登錄。本館自主開發(fā)的OPAC是用ASP.NET進行開發(fā)的,里面集成了調(diào)用校園一卡通驗證的服務(wù)。為了重用這服務(wù),提高開發(fā)效率,本文選擇ASP.NET作為CAS認證服務(wù)端搭建的底層技術(shù)。
首先需要實現(xiàn)包含CAS Server服務(wù)的認證服務(wù)端。Jasig CAS的服務(wù)端和客戶端是使用Java語言編寫的,并在官方網(wǎng)站上提供了許多其他語言編寫的CAS客戶端,但沒有ASP.NET版本的服務(wù)端實現(xiàn)例子。UliTrampe提供了一套解決方案,使得在ASP.NET上可以模擬實現(xiàn)Jasig CAS的服務(wù)端,同時提供客戶端調(diào)用的例子[14]。本文并將里面的CasAuthenticator.cs,CasServer.cs,CasTicket.cs文件引入服務(wù)端項目中。
圖2 深圳大學(xué)圖書館統(tǒng)一認證平臺體系結(jié)構(gòu)
接著在項目中建立一個ASP.NET頁面如cas.aspx,用于接收用戶瀏覽器的用戶認證請求以及內(nèi)嵌的CAS客戶端的Web應(yīng)用的票據(jù)認證請求。調(diào)用CasServer類,由它來處理CAS服務(wù)端的所有事務(wù)。把cas.aspx的頁面表現(xiàn)設(shè)計為登錄頁面,并處理提交的密碼驗證請求,驗證通過后繼續(xù)交給CasServer類處理驗證成功后的工作,如生成票據(jù)返回到請求的Web應(yīng)用頁面等。為了不讓統(tǒng)一認證服務(wù)被惡意使用,增加了應(yīng)用服務(wù)許可列表文件,用于對接入認證的Web應(yīng)用進行控制。具體的邏輯處理流程如圖3所示。
關(guān)鍵步驟及代碼如下:
聲明cas.aspx頁面類需要實現(xiàn)ICasAuthenticator接口;
在cas.aspx頁面實現(xiàn)ICasAuthenticator接口的CasCheckPermission方法、CasLogin方法、CasLogout方法、CasTranslateService方法。其中CasCheckPermission加入驗證請求使用統(tǒng)一認證的應(yīng)用是否合法的判斷。CasLogin加入標記用戶已經(jīng)登錄的處理。CasLogout加入用戶注銷的處理及注銷后跳轉(zhuǎn)的代碼。代碼如下:
public bool CasCheckPermission(string strUserName,string strService){
CASControlBLL cascbll=new CASControlBLL();
return cascbll.IsEnabledHostName(strService);∥判斷應(yīng)用是否合法
}
public void CasLogin(string strUserName,bool doRemember){
FormsAuthentication.SetAuthCookie(strUserName,doRemember);∥標記已經(jīng)登錄
}
public void CasLogout(){
FormsAuthentication.SignOut();∥用戶注銷
…∥注銷后跳轉(zhuǎn)處理
}
在cas.aspx頁面服務(wù)端代碼的PagezLoad方法中,加入:
CasServer.HandlePageLoad(this);
在cas.aspx中設(shè)計登錄界面,并在服務(wù)端代碼中處理登錄請求。關(guān)鍵代碼如下:
protected void btnSubmitzClick(object sender,EventArgs e){
string strUserName=this.txtcardno.Text;∥取得用戶輸入的校園卡號
string strPassWord=this.txtPass.Text;∥取得用戶輸入的密碼
string strCCode=this.txtCode.Text;∥取得用戶輸入的驗證碼
if(PerformAuthentication(strUserName,strPassWord,strCCode)){∥驗證用戶
∥判斷此次請求是否是CAS請求,并處理此次請求
if(CasServer.HandlePageLogin(this,strUserName,false))return;
∥不是CAS請求,則按普通認證成功處理
FormsAuthentication.RedirectFromLoginPage(strUserName,false);
phErrorInfo.Visible=false;
}
else{
∥顯示出錯信息
phErrorInfo.Visible=true;
}
}
為了增強統(tǒng)一認證平臺的安全性,在登錄頁面增加了驗證碼技術(shù)。此外,圖書館向提供SSL證書服務(wù)的公司購買了SSL安全證書,并根據(jù)該公司提供的在IIS服務(wù)器上的安裝文檔,為認證平臺架設(shè)了HTTPS傳輸協(xié)議。
統(tǒng)一認證平臺提供了根據(jù)校園卡號取得包括姓名、單位等用戶信息的Web服務(wù),為有需要的應(yīng)用提供服務(wù)。
2.2 各應(yīng)用系統(tǒng)接入統(tǒng)一認證平臺的實現(xiàn)
2.2.1 OPAC接入統(tǒng)一認證平臺
為了使OPAC接入統(tǒng)一認證平臺,需要改進OPAC原有的用戶認證程序,使用CAS客戶端技術(shù)與統(tǒng)一認證平臺進行認證交互。首先在OPAC項目中加入UliTrampe所提供的CasClient.cs文件,然后修改OPAC的用戶認證程序,使得OPAC在需要檢測用戶的登錄狀態(tài)時,把請求發(fā)往統(tǒng)一認證平臺。用戶登錄后,OPAC從統(tǒng)一認證平臺取得用戶的校園卡號,并在數(shù)據(jù)庫中檢測該用戶是否具備訪問的權(quán)限。關(guān)鍵代碼如下:
protected void PagezLoad(object sender,EventArgs e){
…
if(islog){
∥登錄成功,跳轉(zhuǎn)
}
else{∥向統(tǒng)一認證平臺發(fā)請求,判斷是否已經(jīng)登錄了
if(CasClient.HandlePageLoad(CASConfigHandle.GetCASLoginURL(),CASConfigHandle.GetCASValidateURL(),CASConfigHandle.GetCASServerURL(),out strUserName, out strErrorText)){
if(strUserName!=″″){
∥返回了用戶名,說明在統(tǒng)一認證平臺驗證通過
∥判斷用戶的權(quán)限,并進行登錄成功后的相關(guān)處理
∥登錄成功后跳轉(zhuǎn)
}
}
}
}
2.2.2 圖書館門戶接入統(tǒng)一認證平臺
使用基于PHP的CAS客戶端phpCAS來實現(xiàn)圖書館門戶的認證接入。首先從Jasig CAS的官方網(wǎng)站下載phpCAS,并在需要驗證用戶是否登錄的頁面加入關(guān)鍵代碼:
requirezonce(″CAS.php″);--導(dǎo)入phpCAS
phpCAS::client(CASzVERSIONz2z0,′localhost′,8443,′cas′,true);--填寫CAS服務(wù)端的地址、端口
phpCAS::setNoCasServerValidation();
phpCAS::forceAuthentication();
if(phpCAS::isAuthenticated()==true){--登錄成功后可通過phpCAS::getUser()取得認證后的用戶卡號}
else{--認證失敗處理}
2.2.3 EZProxy接入統(tǒng)一認證平臺
EZProxy支持多種認證方式,其中包括CAS認證方式。在EZProxy的安裝目錄下,打開user.txt,對原來的登錄方式進行注釋,并加入如下配置代碼:
::CAS
LoginURL http:∥cas服務(wù)端登錄地址
ServiceValidateURL http:∥cas服務(wù)端票據(jù)驗證地址
/CAS
修改后重新啟動EZProxy服務(wù),讓上述配置代碼生效。
2.2.4 CARSI Portal接入統(tǒng)一認證平臺
CARSI Portal的認證方式是基于Shibboleth項目[15]。Shibboleth包括2個主要的組件:身份提供者(Identity Provider,簡稱IdP)和服務(wù)提供者(Service Provider,簡稱SP)。其中Idp主要負責對用戶身份進行認證和對用戶屬性進行管理,并且支持CAS認證接入。所以只需要在深圳大學(xué)圖書館的IdP中配置為CAS認證,填寫相應(yīng)的CAS服務(wù)地址及票據(jù)驗證地址,就可以達到接入的要求。
此外,還需要在認證平臺上,開發(fā)用于傳遞用戶屬性的Web服務(wù)。然后根據(jù)CARSI的文檔,使用Java語言開發(fā)UserAttributeService類、UserAttribute類,提供給CARSI調(diào)用取得用戶屬性。UserAttributeService的關(guān)鍵代碼如下:
public static UserAttribute getUserAttribute(String cardNo)throws AxisFault{
…∥采用Axis2的OM調(diào)用方式調(diào)用ASP.NET提供的Web服務(wù)
OMElement responseresult=response.getFirstElement();
∥運用BeanUtil的processObject方法把Web服務(wù)結(jié)果的轉(zhuǎn)為CARSI需要的UserAttribute類
UserAttribute ua=(UserAttribute)BeanUtil.processObject(responseresult,UserAttribute.class,null,true,new DefaultObjectSupplier());
return ua;
}
2.2.5 CALIS認證接入統(tǒng)一認證平臺
CALIS為其提供的公共服務(wù)應(yīng)用系統(tǒng)架設(shè)了統(tǒng)一認證平臺,因此本文根據(jù)CALIS認證平臺接入文檔,開發(fā)深圳大學(xué)圖書館接入CALIS認證平臺的登錄驗證接口以及授權(quán)驗證接口,并讓登錄驗證接口與深圳大學(xué)圖書館統(tǒng)一認證平臺接入,從而達到單點登錄的目的。需要增加一個頁面logincalis.aspx,用于接入統(tǒng)一認證平臺,其關(guān)鍵代碼與OPAC中的登錄頁面關(guān)鍵代碼類似。需要一個頁面idp.aspx,用于接收CALIS的SP轉(zhuǎn)發(fā)的登錄認證請求,在該頁面加入的功能。關(guān)鍵代碼如下:
protected void PagezLoad(object sender,EventArgs e){
∥接收CALIS發(fā)送的sp,goto,idp參數(shù)
if(已經(jīng)登錄){
∥如果已經(jīng)登錄了,生成CALIS要求的artifact參數(shù)并附加在sp地址上,把請求轉(zhuǎn)發(fā)到sp地址上。
}else{
∥沒有登錄,將請求轉(zhuǎn)發(fā)給logincalis.aspx
string returnurl=Request.Url.OriginalString;
Response.Redirect(″../logincalis.aspx?ReturnUrl=″+HttpUtility.UrlEncode(returnurl));
}
}
需要一個頁面loginvalidservice.aspx,用于處理CALIS的SP發(fā)過來的授權(quán)驗證請求,在該頁面往統(tǒng)一認證平臺發(fā)送票據(jù)驗證請求。關(guān)鍵代碼如下:
protected void PagezLoad(object sender,EventArgs e){
∥接收CALIS發(fā)送的artifact參數(shù)
if(artifact參數(shù)是否合法){
∥如果合法,生成CALIS要求的用戶信息。
}else{
∥告訴CALIS不合法的原因。
}
}
3 應(yīng)用效果
如圖4所示,訪問深圳大學(xué)圖書館統(tǒng)一認證平臺所保護的服務(wù)系統(tǒng)時,在沒有登錄前,系統(tǒng)都跳轉(zhuǎn)至統(tǒng)一認證界面,認證通過后,用戶訪問這些服務(wù)系統(tǒng)不再需要進行二次登錄。
圖4 深圳大學(xué)圖書館統(tǒng)一認證效果
實踐證明,深圳大學(xué)圖書館的各個應(yīng)用服務(wù)可以使用基于CAS的統(tǒng)一認證平臺來對用戶身份認證進行集中管理,只要在平臺上登錄一次,就可以訪問統(tǒng)一認證平臺控制下的所有應(yīng)用,實現(xiàn)遠程單點登錄訪問,提高了資源的共享率,減輕用戶登錄系統(tǒng)使用繁瑣的負擔。
4 結(jié) 語
本文選取Jasig CAS技術(shù)來架設(shè)、開發(fā)與部署統(tǒng)一認證服務(wù)平臺,有效地解決了深圳大學(xué)圖書館統(tǒng)一認證問題。用戶一次登錄后就可以無縫訪問所有受保護的Web應(yīng)用服務(wù),減少了用戶的認證復(fù)雜度,節(jié)省了用
戶的精力,提高了效率。對于其他需要接入統(tǒng)一認證服務(wù)平臺的應(yīng)用系統(tǒng),只需要根據(jù)自身的程序語言,集成相應(yīng)的CAS客戶端就可以進行接入,簡單方便。此外,方案中采用HTTPS作為認證信息的傳輸協(xié)議,安全可靠。目前,該認證平臺已經(jīng)正式在深圳大學(xué)圖書館使用,其他高??山梃b此方案來解決多個系統(tǒng)間的統(tǒng)一認證問題。雖然統(tǒng)一認證服務(wù)減輕了用戶認證的負擔,但用戶使用圖書館的服務(wù)仍然不是太方便。隨著云計算概念的出現(xiàn),未來圖書館的各種應(yīng)用服務(wù)應(yīng)提升至云服務(wù)平臺,讀者僅需要登錄云服務(wù)平臺就能享受圖書館提供的各類服務(wù)。
參考文獻
[1]EZProxy[EB/OL].http:∥www.oclc.org/us/en/ezproxy/,2012-02-17.
[2]CARSI[EB/OL].http:∥www.carsi.edu.cn/zh/,2012-02-17.
[3]Carsi Portal[EB/OL].http:∥ds.carsi.edu.cn/portal/,2012-02-17.
[4]CALIS[EB/OL].http:∥www.calis.edu.cn/,2012-02-17.
[5]深圳文獻港[EB/OL].http:∥www.szdnet.org.cn/,2012-02-17.
[6]Jasig CAS[EB/OL].http:∥www.jasig.org/cas,2012-02-17.
[7]許雁冬,李宇.國家科學(xué)圖書館單點登錄系統(tǒng)設(shè)計與實現(xiàn)[J].現(xiàn)代圖書情報技術(shù),2009,(10):28-33.
[8]王慶恒,馬自衛(wèi),李高虎.統(tǒng)一檢索服務(wù)關(guān)鍵技術(shù)的研究與實現(xiàn)[J].現(xiàn)代圖書情報技術(shù),2010,(4):18-23.
[9]李遙,朱曉蕓,楊棖.異構(gòu)系統(tǒng)統(tǒng)一數(shù)字平臺的構(gòu)建[J].計算機工程,2005,31(5):230-233.
[10]劉潤達,諸云強,宋佳,等.一種簡單跨域單點登錄系統(tǒng)的實現(xiàn)[J].計算機應(yīng)用,2007,27(2):288-291.
[11]劉峰,王崢,曹華平,等.基于CAS的門戶單點登錄方案[J].計算機系統(tǒng)應(yīng)用,2011,20(6):77-102.
[12]宋春麗,張仁津,謝剛.基于CAS與Web服務(wù)的遺留系統(tǒng)集成框架研究[J].武漢大學(xué)學(xué)報:理學(xué)版,2011,57(5):424-428.