簡單的說,CAS(Central Authentication Service – 中心認(rèn)證服務(wù))的目的就是使分布在一個(gè)企業(yè)內(nèi)部各個(gè)不同異構(gòu)系統(tǒng)的認(rèn)證工作集中在一起,通過一個(gè)公用的認(rèn)證系統(tǒng)統(tǒng)一管理和驗(yàn)證用戶的身份。在CAS上認(rèn)證的用戶將獲得CAS頒發(fā)的一個(gè)證書,使用這個(gè)證書,用戶可以在承認(rèn)CAS證書的各個(gè)系統(tǒng)上自由穿梭訪問,不需要再次的登錄認(rèn)證。打個(gè)比方:對于加入歐盟的國家而言,在他們國家中的公民可以憑借著自己的身份證,在整個(gè)歐洲旅行,不用簽證。對于企業(yè)內(nèi)部系統(tǒng)而言,CAS就是這個(gè)頒發(fā)歐盟認(rèn)證的系統(tǒng),其它系統(tǒng)都是加入歐盟的國家,它們要共同遵守和承認(rèn)CAS的認(rèn)證規(guī)則。
因此CAS的設(shè)計(jì)愿景就是:
1。實(shí)現(xiàn)一個(gè)易用的、能跨不同Web應(yīng)用的單點(diǎn)登錄認(rèn)證中心;
2。實(shí)現(xiàn)統(tǒng)一的用戶身份和密鑰管理,減少多套密碼系統(tǒng)造成的管理成本和安全漏洞;
3。降低認(rèn)證模塊在IT系統(tǒng)設(shè)計(jì)中的耦合度,提供更好的SOA設(shè)計(jì)和更彈性的安全策略
CAS1.0服務(wù)架構(gòu)實(shí)現(xiàn):
傳統(tǒng)的用戶認(rèn)證流程
我們以A公司的員工日志管理系統(tǒng)為例,如下圖:

使用CAS后的用戶認(rèn)證流程

示意圖中,CAS相關(guān)部分被標(biāo)示為藍(lán)色。在這個(gè)流程中,員工AT向日志系統(tǒng)請求進(jìn)入主頁面,他的瀏覽器發(fā)出的HTTP請求被嵌入在日志系統(tǒng)中的CAS客戶端(HTTP過濾器)攔截,并判斷該請求是否帶有CAS的證書;如果沒有,員工AT將被定位到CAS的統(tǒng)一用戶登錄界面進(jìn)行登錄認(rèn)證,成功后,CAS將自動(dòng)引導(dǎo)AT返回日志系統(tǒng)的主頁面。
CAS的程序邏輯實(shí)現(xiàn)
要完成上述的認(rèn)證業(yè)務(wù),CAS需要一個(gè)認(rèn)證中心服務(wù)器CAS -Server和嵌入在不同業(yè)務(wù)系統(tǒng)方的認(rèn)證客戶端CAS-Client的協(xié)同。
在CAS1.0協(xié)議中,CAS-Server提供的三個(gè)驗(yàn)證服務(wù)接口(web服務(wù)URL):
1. 用戶登錄URL,形如 https://casserver/cas/servlet/login
2. 用戶憑證校驗(yàn)URL,形如 https://casserver/cas/servlet/validate
3. 用戶登出URL,形如 https://casserver/cas/servlet/logout
在CAS-Client端,CAS提供了多樣化的語言支持,其中用于java的是一個(gè)casclient.jar包。目前的版本為2.1.1,其中提供了三種形式的憑證校驗(yàn):
1. 用于Java Servlets的Filter — edu.yale.its.tp.cas.client.filter.CASFilter
2. 用于JSP頁面的CAS Tag Library
3. 通用Java API Object — ServiceTicketValidator / ProxyTicketValidator
通常,企業(yè)應(yīng)用程序基于瀏覽器的B/S模式,這種情況下,系統(tǒng)的用戶憑證(一個(gè)由CAS服務(wù)器生成的唯一 id號,也稱之為ticket)借助cookie和URL參數(shù)方式實(shí)現(xiàn);在B/S環(huán)境中,大多情況下,我們只需要配置CAS Filter或者使用CAS Tag Library就可以輕松實(shí)現(xiàn)的驗(yàn)證客戶端。
如果應(yīng)用是以普通的C/S模式運(yùn)行,則需要應(yīng)用程序自己來維護(hù)這個(gè)ticket在上下文環(huán)境中的傳輸和保存了。這時(shí)候就需要手工調(diào)用ServiceTicketValidator / ProxyTicketValidator對象的方法,向CAS 服務(wù)器提交認(rèn)證,并獲取認(rèn)證結(jié)果進(jìn)行相應(yīng)的處理。
CAS服務(wù)的具體實(shí)現(xiàn)
環(huán)境假設(shè):用戶User要訪問業(yè)務(wù)系統(tǒng)Biz;Biz系統(tǒng)部署在bizserver上;CAS的系統(tǒng)搭建在服務(wù)器casserver上。

圖例說明:
Step1: 用戶第一次訪問Biz系統(tǒng)主頁http://bizserver/index.jsp ;部署在Biz系統(tǒng)上的CASFilter發(fā)現(xiàn)用戶尚未登錄,將用戶重定向的CAS登錄界面 https://casserver/cas/servlet/login?service=http://bizserver/index.jsp ,同時(shí)在重定向的URL上用service參數(shù)將用戶的目標(biāo)地址傳給CAS服務(wù)器。
Step2:用戶在CAS的登錄頁上輸入用戶名密碼登錄,CAS服務(wù)器認(rèn)證通過后,生成一個(gè)ticket,并帶在目標(biāo)地址的尾部返回客戶端的瀏覽器redirect:http://bizserver/index.jsp?ticket=casticket.
Step3:客戶端瀏覽器獲得CAS服務(wù)器的認(rèn)證應(yīng)答,取得憑證ticket后,使用重定向的鏈接http://bizserver/index.jsp?ticket=casticket訪問Biz服務(wù)
Step4: BizServer上的CASFilter再次過濾訪問請求,并獲得ticket憑證。Filter將使用該憑證通過URL https://casserver/cas/servlet/validate?service= http://bizserver/index.jsp &ticket=casticket 向CAS認(rèn)證中心確認(rèn)對應(yīng)的服務(wù)請求和憑證是否有效。根據(jù)CAS服務(wù)器返回的結(jié)果,如果憑證有效,則CASFilter允許用戶進(jìn)入http://bizserver/index.jsp 所指向的頁面;否則,再次重定向到https://casserver/cas/servlet/login?service=http://bizserver/index.jsp 上要求用戶進(jìn)行認(rèn)證。
CAS2.0服務(wù)架構(gòu)實(shí)現(xiàn):
CAS2.0的協(xié)議主要是針對web應(yīng)用的SSO功能增強(qiáng)的協(xié)議,它在1.0協(xié)議基礎(chǔ)上擴(kuò)展了Proxy Authentication(代理認(rèn)證)能力。那么什么是Proxy Authentication呢?!
代理認(rèn)證Proxy Authentication
假設(shè)有一下這樣的應(yīng)用場景:用戶AT早晨來到公司,他的第一件事就是進(jìn)入公司的Portal系統(tǒng)瀏覽一天的新咨詢,如股票信息、天氣情況、業(yè)界新聞。他通過CAS的身份認(rèn)證登錄了門戶系統(tǒng),看到了他訂制的信息。之后,他要訪問portal中的郵件信息,看看有沒有新的郵件。這時(shí)候Portal系統(tǒng)必須訪問他的IMAP服務(wù)器,這需要他的私人密碼。我們知道Portal是通過CAS對AT進(jìn)行認(rèn)證的,因此Portal上沒有AT的個(gè)人密碼信息。這時(shí),我們發(fā)現(xiàn),Portal需要代表AT的身份向IMAP服務(wù)器提交身份認(rèn)證,而這正是Proxy Authentication的作用。
CAS2.0系統(tǒng)架構(gòu)中的角色

CAS2.0系統(tǒng)中的用到的憑證(ticket)

以上對于CAS2.0協(xié)議中用到的5種ticket的說明,乍看起來也許會(huì)讓你云里霧里的。沒關(guān)系,下面我們就來詳細(xì)闡述這5種憑證在實(shí)際認(rèn)證流程中的作用。在闡述具體流程前,我們要先關(guān)注一下2.0協(xié)議中對客戶端配置的需求.
CAS2.0的客戶端配置
在2.0協(xié)議中,CAS-Server端的配置與1.0基本一致。但在客戶端上,多增加了一個(gè)call back URL,該URL用來提供server端向client端傳輸PGT時(shí)使用。因此,除了要配置edu.yale.its.tp.cas.client.filter.CASFilter作為認(rèn)證過濾器外,還要配置edu.yale.its.tp.cas.proxy.ProxyTicketReceptor這個(gè)servlet,作為server回傳PGT的call back URL,如下:

CAS2.0代理認(rèn)證流程
以下的流程圖模擬上述的用戶AT通過Portal向他的IMAP郵件服務(wù)器請求電子郵件的認(rèn)證過程。在該過程中,充當(dāng)Service和Proxy兩個(gè)角色的Portal使用CAS Filter對訪問其自身的用戶進(jìn)行CAS認(rèn)證;同時(shí)Portal要使用ProxyTicketReceptor servlet接收來自CAS server的PGT信息,并使用ProxyTicketValidator對象向CAS獲取訪問IMAP服務(wù)器的Proxy Ticket憑證;最終從IMAP服務(wù)器上獲取AT用戶的mail信息。同樣的,這里的IMAP服務(wù)器也要接受并認(rèn)可CAS對其用戶的認(rèn)證管理,同時(shí)它自己也成為二級Proxy,在有需要的情況下,一樣可以向它的back-end Service發(fā)起Proxy Authentication代理認(rèn)證請求……

其中藍(lán)色線表示HTTP或HTTPS的請求;紅色線表示應(yīng)答;黑色線表示來自CAS server端的回調(diào)操作。
到此,本章節(jié)對JA-SIG(CAS)的整體功能和身份認(rèn)證業(yè)務(wù)架構(gòu)進(jìn)行初步的講解,在后續(xù)的章節(jié)中,我們將對CAS平臺(tái)的服務(wù)端和客戶端的編程與應(yīng)用定制等相關(guān)內(nèi)容的進(jìn)行介紹。