統(tǒng)一身份認(rèn)證平臺(tái)集成接口文檔_第1頁
統(tǒng)一身份認(rèn)證平臺(tái)集成接口文檔_第2頁
統(tǒng)一身份認(rèn)證平臺(tái)集成接口文檔_第3頁
統(tǒng)一身份認(rèn)證平臺(tái)集成接口文檔_第4頁
統(tǒng)一身份認(rèn)證平臺(tái)集成接口文檔_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、三峽大學(xué)統(tǒng)一身份認(rèn)證平臺(tái)接口文檔目錄1.統(tǒng)一身份認(rèn)證簡介31.1背景知識(shí)31.1.1 什么是單點(diǎn)登錄(Single Sign On):31.1.2 中心認(rèn)證服務(wù)的設(shè)計(jì)愿景:31.2CAS的實(shí)現(xiàn)4系統(tǒng)中的用到的憑證(ticket):52.JAVA語言62.1CAS簡單登陸的實(shí)現(xiàn)62.2CAS登出123.PHP語言133.1CAS單點(diǎn)登錄測試環(huán)境搭建步驟133.1.1獲取必要的驅(qū)動(dòng)程序:133.1.2搭建php運(yùn)行環(huán)境133.1.3配置PHP cas 客戶端測試程序133.2PHP-CAS客戶端143.2.1cas-client的初始化143.2.2設(shè)置不是SSL的CAS認(rèn)證163.2.3進(jìn)行CA

2、S認(rèn)證173.2.4登出204.ASP.NET語言224.1搭建ASP.NET環(huán)境224.2CAS簡單登陸實(shí)現(xiàn)224.3CAS登出實(shí)現(xiàn)235.ASP語言245.1CAS簡單登錄實(shí)現(xiàn)245.2CAS登出實(shí)現(xiàn)256.附錄266.1附錄1266.2附錄2286.3附錄3306.4附錄4316.5附錄5321. 統(tǒng)一身份認(rèn)證簡介1.1 背景知識(shí)1.1.1 什么是單點(diǎn)登錄(Single Sign On):所謂單點(diǎn)登錄是指基于用戶/會(huì)話認(rèn)證的一個(gè)過程,用戶只需一次性提供憑證(僅一次登錄),就可以訪問多個(gè)應(yīng)用。目前單點(diǎn)登錄主要基于Web的多種應(yīng)用程序,即通過瀏覽器實(shí)現(xiàn)對(duì)多個(gè)B/S架構(gòu)應(yīng)用的統(tǒng)一賬戶認(rèn)證。1.

3、1.2 中心認(rèn)證服務(wù)的設(shè)計(jì)愿景:簡單的說,中心認(rèn)證服務(wù)(Central Authentication Service 縮寫:CAS)的目的就是使分布在一個(gè)企業(yè)內(nèi)部各個(gè)不同異構(gòu)系統(tǒng)的認(rèn)證工作集中在一起,通過一個(gè)公用的認(rèn)證系統(tǒng)統(tǒng)一管理和驗(yàn)證用戶的身份,一般我們稱之為統(tǒng)一身份認(rèn)證平臺(tái)。在CAS上認(rèn)證的用戶將獲得CAS頒發(fā)的一個(gè)證書,使用這個(gè)證書,用戶可以在承認(rèn)CAS證書的各個(gè)系統(tǒng)上自由穿梭訪問,不需要再次的登錄認(rèn)證。打個(gè)比方:對(duì)于加入歐盟的國家而言,在他們國家中的公民可以憑借著自己的身份證,在整個(gè)歐洲旅行,不用簽證。對(duì)于學(xué)校內(nèi)部系統(tǒng)而言,CAS就好比這個(gè)頒發(fā)歐盟認(rèn)證的系統(tǒng),其它系統(tǒng)都是加入歐盟的國家

4、,它們要共同遵守和承認(rèn)CAS的認(rèn)證規(guī)則。因此CAS的設(shè)計(jì)愿望就是:Ø 實(shí)現(xiàn)一個(gè)易用的、能跨不同Web應(yīng)用的單點(diǎn)登錄認(rèn)證中心;Ø 實(shí)現(xiàn)統(tǒng)一的用戶身份和密鑰管理,減少多套密碼系統(tǒng)造成的管理成本和安全漏洞;Ø 降低認(rèn)證模塊在IT系統(tǒng)設(shè)計(jì)中的耦合度,提供更好的SOA設(shè)計(jì)和更彈性的安全策略。1.2 CAS的實(shí)現(xiàn)從結(jié)構(gòu)上看,CAS 包含兩個(gè)部分: CAS Server 和 CAS Client。CAS Server 需要獨(dú)立部署,主要負(fù)責(zé)對(duì)用戶的認(rèn)證工作;CAS Client 負(fù)責(zé)處理對(duì)客戶端受保護(hù)資源的訪問請(qǐng)求,需要登錄時(shí),重定向到 CAS Server。圖1 是 CAS

5、最基本的協(xié)議過程:CAS Client 與受保護(hù)的客戶端應(yīng)用部署在一起,以 Filter 方式保護(hù)受保護(hù)的資源。對(duì)于訪問受保護(hù)資源的每個(gè) Web 請(qǐng)求,CAS Client 會(huì)分析該請(qǐng)求的 Http 請(qǐng)求中是否包含 Service Ticket,如果沒有,則說明當(dāng)前用戶尚未登錄,于是將請(qǐng)求重定向到指定好的 CAS Server 登錄地址,并傳遞 Service (也就是要訪問的目的資源地址),以便登錄成功過后轉(zhuǎn)回該地址。用戶在第 3 步中輸入認(rèn)證信息,如果登錄成功,CAS Server 隨機(jī)產(chǎn)生一個(gè)相當(dāng)長度、唯一、不可偽造的 Service Ticket,并緩存以待將來驗(yàn)證,之后系統(tǒng)自動(dòng)重定向

6、到 Service 所在地址,并為客戶端瀏覽器設(shè)置一個(gè) Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新產(chǎn)生的 Ticket 過后,在第 5,6 步中與 CAS Server 進(jìn)行身份合適,以確保 Service Ticket 的合法性。在該協(xié)議中,所有與 CAS 的交互均采用 SSL 協(xié)議,確保,ST 和 TGC 的安全性。協(xié)議工作過程中會(huì)有 2 次重定向的過程,但是 CAS Client 與 CAS Server 之間進(jìn)行 Ticket 驗(yàn)證的過程對(duì)于用戶是透明的。另外,CAS 協(xié)議中還提供了 Proxy (代理)模式,以適應(yīng)更加高級(jí)

7、、復(fù)雜的應(yīng)用場景,具體介紹可以參考 CAS 官方網(wǎng)站上的相關(guān)文檔。 系統(tǒng)中的用到的憑證(ticket):Ticket-granting cookie(TGC) 憑證存放cookie它是存放用戶身份認(rèn)證憑證的cookie,在瀏覽器和CAS間通訊時(shí)使用,并且只能基于安全通道HTTPS。它是CAS用來明確用戶身份的憑證,是實(shí)現(xiàn)web系統(tǒng)SSO的可選方案之一。Service ticket(ST) 服務(wù)許可證Service ticket憑證由CAS服務(wù)器發(fā)出,通過客戶端瀏覽器,到達(dá)業(yè)務(wù)服務(wù)器(通過URL重定向和ticket參數(shù)來實(shí)現(xiàn))。每個(gè)ST只能使用一次,針對(duì)特定的服務(wù)生成唯一識(shí)別碼。Proxy-gr

8、anting ticket(PGT) 代理授權(quán)許可證該許可證由CAS服務(wù)器頒發(fā)給擁有ST憑證的服務(wù)(如果一個(gè)服務(wù)自身沒有獲得ST憑證,是不可能獲得PGT的)。該許可證綁定一個(gè)用戶的一個(gè)特定服務(wù),使其擁有向CAS服務(wù)器申請(qǐng),以獲得“代理憑證Proxy-tickets”的能力。Proxy-granting ticket IOU(PGTIOU) 代理授權(quán)許可證索引這個(gè)許可證索引將通過憑證校驗(yàn)時(shí)的應(yīng)答信息由CAS服務(wù)器端返回給CAS客戶端。與此同時(shí),與該索引對(duì)應(yīng)的PGT將通過回調(diào)鏈接傳給web應(yīng)用。Web應(yīng)用必須維護(hù)著PGT索引和PGT之間映射關(guān)系的內(nèi)存表。Proxy ticket(PT)代理許可證是

9、應(yīng)用程序代理用戶身份,對(duì)目標(biāo)程序進(jìn)行訪問的憑證。代理許可證保存有代理及代理們進(jìn)行逐級(jí)訪問過程的信息。一個(gè)代理訪問的有可能是另一個(gè)更高級(jí)的代理,因此PT可以用來獲取下一級(jí)代理的PGT。這些逐級(jí)生成的PGT將保存有從用戶到最終目標(biāo)之間的代理隊(duì)列的完整信息。后面的章節(jié)將介紹常用的幾種語言編寫的程序,如何如何集成到統(tǒng)一身份認(rèn)證中心平臺(tái)。如果將來學(xué)校還有其他語言的系統(tǒng)需要集成到統(tǒng)一身份認(rèn)證中心平臺(tái),請(qǐng)聯(lián)系公司索取相應(yīng)的實(shí)現(xiàn)方法。2. JAVA語言2.1 CAS簡單登陸的實(shí)現(xiàn)假設(shè) CAS Server 單獨(dú)部署在一臺(tái)機(jī)器 A,而客戶端應(yīng)用部署在機(jī)器 B 上,由于客戶端應(yīng)用與 CAS Server 的通信采

10、用 SSL,因此,需要在 A 與 B 的 JRE 之間建立信任關(guān)系。首先與 A 機(jī)器一樣,要生成 B 機(jī)器上的證書,配置應(yīng)用服務(wù)器的 SSL 協(xié)議。其次,下載 的 InstallCert.java,運(yùn)行“ java InstallCert compA:7002 ”命令,并且在接下來出現(xiàn)的詢問中輸入1。這樣,就將 A 添加到了 B 的 truststore 中。如果多個(gè)客戶端應(yīng)用分別部署在不同機(jī)器上,那么每個(gè)機(jī)器都需要與 CAS Server 所在機(jī)器建立信任關(guān)系。u 配置 CAS Filter準(zhǔn)備好應(yīng)用 casTest1 和 casTest2 過后,分別部署在 B 和 C 機(jī)器上,由于 cas

11、Test1 和casTest2,B 和 C 完全等同,我們以 casTest1 在 B 機(jī)器上的配置做介紹,假設(shè) A 和 B 的域名分別為 domainA 和 domainB。將cas-client-java-2.1.1.jar 并拷貝到 casTest1/WEB-INF/lib目錄下,修改 web.xml 文件,添加 CAS Filter,如清單 10 所示:u 添加 CAS Filter<web-app> . <filter> <filter-name>CAS Filter</filter-name> <filter-class>

12、edu.yale.its.tp.cas.client.filter.CASFilter</filter-class> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name> <param-value>https:/domainA:8443/cas/login</param-value> </init-param> <init-param> <param-name>edu.yale.i

13、ts.tp.cas.client.filter.validateUrl</param-name> <param-value>https:/domainA:8443/cas/serviceValidate</param-value> </init-param> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> <param-value>domainB:8080</param-val

14、ue> </init-param> </filter> <filter-mapping> <filter-name>CAS Filter</filter-name> <url-pattern>/protected-pattern/*</url-pattern> </filter-mapping> .</web-app>對(duì)于所有訪問滿足 casTest1/protected-pattern/ 路徑的資源時(shí),都要求到 CAS Server 登錄,如果需要整個(gè) casTest1 均受保護(hù)

15、,可以將 url-pattern 指定為“/*”。從以上配置可以看到,我們可以為 CASFilter 指定一些參數(shù),并且有些是必須的,表格 1 和表格 2 中分別是必需和可選的參數(shù):表格 1. CASFilter 必需的參數(shù)參數(shù)名 作用 edu.yale.its.tp.cas.client.filter.loginUrl 指定 CAS 提供登錄頁面的 URL edu.yale.its.tp.cas.client.filter.validateUrl 指定 CAS 提供 service ticket 或 proxy ticket 驗(yàn)證服務(wù)的 URL edu.yale.its.tp.cas.cli

16、ent.filter.serverName 指定客戶端的域名和端口,是指客戶端應(yīng)用所在機(jī)器而不是 CAS Server 所在機(jī)器,該參數(shù)或 serviceUrl 至少有一個(gè)必須指定 edu.yale.its.tp.cas.client.filter.serviceUrl 該參數(shù)指定過后將覆蓋 serverName 參數(shù),成為登錄成功過后重定向的目的地址 表格 2. CASFilter 可選參數(shù)參數(shù)名 作用 xyCallbackUrl 用于當(dāng)前應(yīng)用需要作為其他服務(wù)的代理(proxy)時(shí)獲取 Proxy Granting T

17、icket 的地址 edu.yale.its.tp.cas.client.filter.authorizedProxy 用于允許當(dāng)前應(yīng)用從代理處獲取 proxy tickets,該參數(shù)接受以空格分隔開的多個(gè) proxy URLs,但實(shí)際使用只需要一個(gè)成功即可。當(dāng)指定該參數(shù)過后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate edu.yale.its.tp.cas.client.filter.renew 如果指定為 true,那么受保護(hù)的資源每次被訪問時(shí)均要求用戶重新進(jìn)行驗(yàn)證,而不管之前是否已經(jīng)通過 edu.yale.its.tp.ca

18、s.client.filter.wrapRequest 如果指定為 true,那么 CASFilter 將重新包裝 HttpRequest,并且使 getRemoteUser() 方法返回當(dāng)前登錄用戶的用戶名 edu.yale.its.tp.cas.client.filter.gateway 指定 gateway 屬性 u 傳遞登錄用戶名CAS 在登錄成功過后,會(huì)給瀏覽器回傳 Cookie,設(shè)置新的到的 Service Ticket。但客戶端應(yīng)用擁有各自的 Session,我們要怎么在各個(gè)應(yīng)用中獲取當(dāng)前登錄用戶的用戶名呢?CAS Client 的 Filter 已經(jīng)做好了處理,在登錄成功后,就

19、可以直接從 Session 的屬性中獲取,如下所示:在 Java 中通過 Session 獲取登錄用戶名: / 以下兩者都可以session.getAttribute(CASFilter.CAS_FILTER_USER);session.getAttribute("edu.yale.its.tp.cas.client.filter.user");通過 JSTL 獲取登錄用戶名: <c:out value="$sessionScopeCAS:'edu.yale.its.tp.cas.client.filter.user'"/>另

20、外,CAS 提供了一個(gè) CASFilterRequestWrapper 類,該類繼承自HttpServletReque stWrapper,主要是重寫了 getRemoteUser() 方法,只要在前面配置 CASFilter 的時(shí)候?yàn)槠湓O(shè)置“ edu.yale.its.tp.cas.client.filter.wrapRequest ”參數(shù)為 true,就可以通過 getRemoteUser() 方法來獲取登錄用戶名,具體方法如下所示:通過 CASFilterRequestWrapper 獲取登錄用戶名: CASFilterRequestWrapper reqWrapper=new CASF

21、ilterRequestWrapper(request);out.println("The logon user:" + reqWrapper.getRemoteUser();u 測試效果在 casTest1 和 casTest2 中,都有一個(gè)簡單 Servlet 作為歡迎頁面 WelcomPage,且該頁面必須登錄過后才能訪問,頁面代碼如下所示:WelcomePage 頁面代碼:public class WelcomePage extends HttpServlet public void doGet(HttpServletRequest request, HttpSer

22、vletResponse response) throws IOException, ServletException response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Welcome to casTest2 sample System!</titl

23、e>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Welcome to casTest1 sample System!</h1>"); CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request); out.println("<p>The logon user:" + r

24、eqWrapper.getRemoteUser() + "</p>"); HttpSession session=request.getSession(); out.println("<p>The logon user:" + session.getAttribute(CASFilter.CAS_FILTER_USER) + "</p>"); out.println("<p>The logon user:" + session.getAttribute("e

25、du.yale.its.tp.cas.client.filter.user") + "</p>"); out.println("</body>"); out.println("</html>"); 在上面所有配置結(jié)束過后,分別在 A, B, C上啟動(dòng) cas, casTest1 和 casTest2,按照下面步驟來訪問 casTest1 和 casTest2:Ø 打開瀏覽器,訪問 http:/domainB:8080/casTest1/WelcomePage ,瀏覽器會(huì)彈出安全提

26、示,接受后即轉(zhuǎn)到 CAS 的登錄頁面:Ø 登錄成功后,再重定向到 casTest1 的 WelcomePage 頁面登錄后訪問 casTest1 的效果:可以看到圖中地址欄里的地址多出了一個(gè) ticket 參數(shù),這就是 CAS 分配給當(dāng)前應(yīng)用的 ST(Service Ticket)。再在同一個(gè)瀏覽器的地址欄中輸入 http:/domainC:8080/casTest2/WelcomePage ,系統(tǒng)不再提示用戶登錄,而直接出現(xiàn)如下圖 所示的頁面,并且顯示在 casTest1 中已經(jīng)登錄過的用戶:在 casTest1 中登錄過后訪問 casTest2 的效果:重新打開一個(gè)瀏覽器窗口,先

27、輸入 http:/domainC:8080/casTest2/WelcomePage ,系統(tǒng)要求登錄,在登錄成功過后,正確顯示 casTest2 的頁面。之后再在地址欄重新輸入 http:/domainB:8080/casTest1/WelcomePage ,會(huì)直接顯示 casTest1 的頁面而無需再次登錄。 2.2 CAS登出在業(yè)務(wù)系統(tǒng)的logout模塊中將logout鏈接的URL改成CAS服務(wù)器的logout接口即可。代碼如下:Response.Redirect(“:7002/cas/logout”);3. PHP語言3.1 CAS單點(diǎn)登錄測試環(huán)境搭建步驟3.1.1 獲取必要的驅(qū)動(dòng)程序:

28、首先,我們要拿到為PHP語言準(zhǔn)備的CAS的客戶端驅(qū)動(dòng)程序:CAS-1.0.1.tgz。3.1.2 搭建php運(yùn)行環(huán)境 3.1.3 配置PHP cas 客戶端測試程序解壓CAS-1.0.1.tgz,將CAS 目錄和CAS.php 拷入C:AppServwww(AppServ默認(rèn)安裝目錄中的www目錄)中。這樣, cas 的php客戶端就配置好了。我們來測試一下這個(gè)php的cas 客戶端是否起作用。  修改php客戶端自帶的一個(gè)示例:example_simple.php,并拷貝到www目錄中。代碼修改如下:<?php / phpCAS simple c

29、lient/ import phpCAS libinclude_once('CAS.php'); phpCAS:setDebug();/ initialize phpCASphpCAS:client(CAS_VERSION_2_0,'localhost',8443,'cas'); / no SSL validation for the CAS serverphpCAS:setNoCasServerValidation();/ force CAS authenticationphpCAS:forceAuthentication(

30、);/ at this step, the user has been authenticated by the CAS server/ and the user's login name can be read with phpCAS:getUser()./ logout if desiredif (isset($_REQUEST'logout')          phpCAS:logout();/ for this test, simply print that the authent

31、ication was successfull?><html>  <head>    <title>phpCAS simple client</title>  </head>  <body>    <h1>Successfull Authentication!</h1>    <p>the user's login is <b><?php

32、 echo phpCAS:getUser(); ?></b>.</p>    <p>phpCAS version is <b><?php echo phpCAS:getVersion(); ?></b>.</p>    <p><a href="?logout=">Logout</a></p>  </body></html>測試步驟:Ø

33、訪問http:/localhost/ example_simple.phpØ CAS檢測到用戶沒有登錄,轉(zhuǎn)向::7002/cas/login?service=http%3A%2F%2Flocalhost%2Fexample_simple.php 登錄界面。Ø 在登錄界面輸入admin/admin用戶名和密碼。Ø 登錄成功,轉(zhuǎn)回http:/localhost/example_simple.php,并顯示有關(guān)信息。3.2 PHP-CAS客戶端PHP-CAS客戶端主要CAS文件夾和CAS.php。3.2.1 cas-client的初始化正如上面給出的example_si

34、mple.php的簡單例子,利用代碼“phpCAS:client (CAS_VERSION_2_0,'localhost',8443,'cas'); ”完成了client的初始化操作。cas-client的初始化是由CAS.php做數(shù)據(jù)檢查,具體實(shí)現(xiàn)是由client.php來完成client類的構(gòu)造。代碼如下:global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;phpCAS:traceBegin();if ( is_object($PHPCAS_CLIENT) ) phpCAS:error($PHPCAS_INIT_CAL

35、L'method'.'() has already been called (at '.$PHPCAS_INIT_CALL'file'.':'.$PHPCAS_INIT_CALL'line'.')');if ( gettype($server_version) != 'string' ) phpCAS:error('type mismatched for parameter $server_version (should be string')');if (

36、gettype($server_hostname) != 'string' ) phpCAS:error('type mismatched for parameter $server_hostname (should be string')');if ( gettype($server_port) != 'integer' ) phpCAS:error('type mismatched for parameter $server_port (should be integer')');if ( gettype($s

37、erver_uri) != 'string' ) phpCAS:error('type mismatched for parameter $server_uri (should be string')');/ store where the initialzer is called from$dbg = phpCAS:backtrace();$PHPCAS_INIT_CALL = array('done' => TRUE,'file' => $dbg0'file','line'

38、=> $dbg0'line','method' => _CLASS_.':'._FUNCTION_);CAS.php是一個(gè)phpCAS類,主要是為了CAS的實(shí)現(xiàn)做支持。可以在php代碼中直接調(diào)用phpCAS類的方法,只要在代碼前面加入“include_once('CAS.php');”。這個(gè)類中提供了兩個(gè)initialization:phpCAS client initializer、phpCAS proxy initializer。分別初始化兩種客戶端:不帶代理的客戶端和有代理的客戶端。該初始化都調(diào)用了client.

39、php中的client的構(gòu)造函數(shù),根據(jù)傳入的參數(shù)的不同來區(qū)分是否具體代理。代碼如下:/具有代理的client$PHPCAS_CLIENT = new CASClient($server_version,TRUE/*proxy*/,$server_hostname,$server_port,$server_uri,$start_session);/不具有代理的client$PHPCAS_CLIENT = new CASClient($server_version,FALSE/*proxy*/,$server_hostname,$server_port,$server_uri,$start_ses

40、sion);Client.php中的client構(gòu)造主要完成以下工作:Ø 存儲(chǔ)以前的session,創(chuàng)建新session;Ø 判斷是否有代理功能并判斷當(dāng)前server_version是否支持(CAS_VERSION_1_0不支持);Ø 判斷$server_hostname、$server_port、$server_uri是否合法;Ø 如果上述都合法則修正$server_uri(“/”與“”的區(qū)別);Ø 判斷是否有代理功能,有則設(shè)置是否是CallbackMode;Ø 如果是CallbackMode則判斷phpCAS是否是https;&#

41、216; 獲取并保存ticket并根據(jù)不同的版本把它從CGI中移除,為了安全。完整代碼見附錄1。 3.2.2 設(shè)置不是SSL的CAS認(rèn)證調(diào)用phpCAS類中的setNoCasServerValidation()進(jìn)行設(shè)置。設(shè)置該CAS服務(wù)認(rèn)證不是SSL方式的認(rèn)證。如果不加入這句語句的話認(rèn)證可能無法正常運(yùn)行。如下圖4所示:圖4:沒有加入phpCAS:setNoCasServerValidation()語句輸入帳戶密碼后畫面會(huì)停留在圖4這個(gè)頁面,無論你點(diǎn)擊“是”還是“否”都無法進(jìn)入你想進(jìn)入的系統(tǒng)。當(dāng)加入phpCAS:setNoCasServerValidation()語句后,點(diǎn)擊圖4頁面上的“是”則

42、可以進(jìn)入系統(tǒng),如圖5所示:圖5:加入了phpCAS:setNoCasServerValidation()語句3.2.3 進(jìn)行CAS認(rèn)證在PHP代碼中加入phpCAS:forceAuthentication();即可進(jìn)行CAS認(rèn)證。forceAuthentication()方法是phpCAS類中的一個(gè)方法。它完成了CAS認(rèn)證的檢查,首先檢測是否初始化$PHPCAS_CLIENT,成功之后再檢查之前是否認(rèn)證過,以及記錄此次認(rèn)證。代碼如下:function forceAuthentication()global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;phpC

43、AS:traceBegin();if ( !is_object($PHPCAS_CLIENT) ) phpCAS:error('this method should not be called before '._CLASS_.':client() or '._CLASS_.':proxy()');$auth = $PHPCAS_CLIENT->forceAuthentication();/ store where the authentication has been checked and the result$dbg = phpCAS

44、:backtrace();$PHPCAS_AUTH_CHECK_CALL = array('done' => TRUE,'file' => $dbg0'file','line' => $dbg0'line','method' => _CLASS_.':'._FUNCTION_,'result' => $auth );if ( !$auth ) phpCAS:trace('user is not authenticated, red

45、irecting to the CAS server');$PHPCAS_CLIENT->forceAuthentication(); else phpCAS:trace('no need to authenticate (user '.phpCAS:getUser().'' is already authenticated)');phpCAS:traceEnd();return $auth; 認(rèn)證的實(shí)現(xiàn)是在client.php中的forceAuthentication()方法完成,它來完成是否認(rèn)證的檢查以及進(jìn)行認(rèn)證。forceAuthen

46、tication()通過調(diào)用isAuthenticated()來檢查之前是否登錄過,如果沒有登錄過則重定向至CAS。isAuthenticated()則又調(diào)用wasPreviouslyAuthenticated(),wasPreviouslyAuthenticated()在非代理模式下調(diào)用isSessionAuthenticated()來進(jìn)行最終的session的檢查從而完成是否認(rèn)證的檢查?,F(xiàn)在我們來看看這幾個(gè)方法的具體工作是哪些。 isSessionAuthent icated()function isSessionAuthenticated ()return !empty($

47、_SESSION'phpCAS''user');從代碼可以看出,isSessionAuthenticated ()只是對(duì)$_SESSION'phpCAS''user'進(jìn)行檢查是否為空。如果為空的話則返回FALSE即沒有認(rèn)證過。反之返回TRUE即之前認(rèn)證過了。 wasPreviouslyAuthenticated()wasPreviouslyAuthenticated()還區(qū)分了代理和非代理。對(duì)于有代理的,則進(jìn)行$_SESSION'phpCAS''user'和$_SESSION'

48、phpCAS''pgt'進(jìn)行是否為空檢查并進(jìn)行User、PGT、ST和PT的賦值。不存在的都賦值為空。并用phpCAS:trace()進(jìn)行記錄信息。對(duì)于沒有代理的,則進(jìn)行簡單的phpCAS檢查,調(diào)用isSessionAuthenticated ()來完成操作。同樣調(diào)用phpCAS:trace()記錄信息。并返回檢查結(jié)果。在代理模式只有當(dāng)$_SESSION'phpCAS''user'和$_SESSION'phpCAS''pgt'都存在的時(shí)候才返回TRUE,其他情況都返回FALSE。在非代理模式返回結(jié)構(gòu)由isS

49、essionAuthenticated ()產(chǎn)生。代碼見附錄2.備注:該方法還會(huì)檢查是否是CallbackMode,并進(jìn)行適當(dāng)?shù)馁x值。 isAuthenticated()isAuthenticated()主要是在完成wasPreviouslyAuthenticated()檢查返回TRUE的情況下對(duì)ST、PT和PGT的檢測(代理模式下才對(duì)PGT進(jìn)行檢測)。當(dāng)存在ST時(shí)則對(duì)ST進(jìn)行檢測,調(diào)用validateST()完成檢測,在檢測成功的情況下記錄信息返回TRUE,失敗則返回FALSE。同樣進(jìn)行PT和PGT檢測。如果ST和PT都不存在則檢測失敗,返回FALSE。代碼見附錄

50、.4 forceAuthentication()function forceAuthentication()phpCAS:traceBegin();if ( $this->isAuthenticated() ) / the user is authenticated, nothing to be done.phpCAS:trace('no need to authenticate');$res = TRUE; else / the user is not authenticated, redirect to the CAS serverif (isset($_SESSIO

51、N'phpCAS''auth_checked') unset($_SESSION'phpCAS''auth_checked');$this->redirectToCas(FALSE/* no gateway */);/ never reached$res = FALSE;phpCAS:traceEnd($res);return $res;forceAuthentication()并不復(fù)雜,它首先調(diào)用isAuthenticated()來檢測是否登錄過,在失敗的情況下才進(jìn)行重定向至CAS服務(wù)器,在此我就不多加解釋了,代碼一目了然

52、。綜上所述:CAS的認(rèn)證步驟如下:非代理模式方法調(diào)用過程:phpCAS:forceAuthentication()->”PHPCAS_CLIENT->forceAuthentication()”-> “PHPCAS_CLIENT-> isAuthenticated()”->” PHPCAS_CLIENT->wasPreviouslyAuthenticated()”->” PHPCAS_CLIENT->isSessionAuthenticated”實(shí)際檢測過程:$_SESSION'phpCAS''user'->

53、 ST/PT->TRUE代理模式方法調(diào)用過程:phpCAS:forceAuthentication()->”PHPCAS_CLIENT->forceAuthentication()”-> “PHPCAS_CLIENT-> isAuthenticated()”->” PHPCAS_CLIENT->wasPreviouslyAuthenticated()”實(shí)際檢測過程:$_SESSION'phpCAS''user'&& $_SESSION'phpCAS''pgt'->ST

54、/PT和PGT->TRUE備注:檢測過程只要一個(gè)不通過就返回FALSE。檢測結(jié)果是TRUE的無需登錄直接進(jìn)入業(yè)務(wù)系統(tǒng)。檢測失敗尚未登錄FALSE->” PHPCAS_CLIENT->redirectToCas()”->CAS服務(wù)器進(jìn)行認(rèn)證3.2.4 登出在PHP代碼中加入:if (isset($_REQUEST'logout') phpCAS:logout();即完成了登出功能。isset($_REQUEST'logout')是檢測是否有l(wèi)ogout請(qǐng)求,如果有則調(diào)用phpCAS:logout()進(jìn)行登出。 phpCAS:l

55、ogout()phpCAS:logout首先檢測$PHPCAS_CLIENT是否被初始化,然后檢測參數(shù)$params是否是array類型,如果是string類型則提示要求調(diào)用phpCAS:logoutWithUrl($url)。在檢測$params為array類型后將$params中的$key = "service" 和$key = "url"的元素復(fù)制到$parsedParams中。并調(diào)用$PHPCAS_CLIENT->logout($parsedParams)進(jìn)行l(wèi)ogout處理。phpCAS:logout()的代碼見附錄4.phpCAS中有很

56、多中l(wèi)ogout的方法,每種方法都能實(shí)現(xiàn)不同的登出方式,這些方法有:logoutWithRedirectService($service)、logoutWithRedirectServiceAndUrl($service, $url)、logoutWithUrl($url)還有上面說的最簡單的logout()。他們的實(shí)現(xiàn)都很簡單,都是先進(jìn)行參數(shù)檢測再調(diào)用$PHPCAS_CLIENT->logout(參數(shù)),根據(jù)輸入不同的參數(shù)來完成不同的logout。 $PHPCAS_CLIENT->logout($parsedParams)$PHPCAS_CLIENT->log

57、out($parsedParams)完成logout功能,代碼如下:function logout($params) phpCAS:traceBegin();$cas_url = $this->getServerLogoutURL();$paramSeparator = '?'if (isset($params'url') $cas_url = $cas_url . $paramSeparator . "url=" . urlencode($params'url'); $paramSeparator = '&am

58、p;'if (isset($params'service') $cas_url = $cas_url . $paramSeparator . "service=" . urlencode($params'service'); header('Location: '.$cas_url);session_unset();session_destroy();$this->printHTMLHeader($this->getString(CAS_STR_LOGOUT);printf('<p>&#

59、39;.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);$this->printHTMLFooter();phpCAS:traceExit();exit();從代碼可見,logout()根據(jù)傳入?yún)?shù)的不同創(chuàng)建不同的cas_url從而logout到不同的頁面。綜上所述,要完成logout只用根據(jù)需求選擇phpCAS中的不同logout方法即可完成。不同的logout方法歸根結(jié)底都是通過調(diào)用CASClient類中的logout(參數(shù)),傳入不同的參數(shù)來完成不同的登出。4. ASP.NET語言4.1 搭建ASP.NET環(huán)境4.2 CAS簡單登陸實(shí)現(xiàn)CAS .NET客戶端,是一個(gè)dll文件,可以在項(xiàng)目中引用,然后通過下邊的代碼就可以使用:在web.config文件中增加關(guān)于cas服務(wù)器和本地服務(wù)的地址信息:<configuration> <appSettings> <add key="casLoginURL" value=":7002/cas/login" /> <add key=&q

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論