當前位置:首頁 » 硬碟大全 » CAS50清除TGC緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

CAS50清除TGC緩存

發布時間: 2023-04-07 02:10:21

❶ CAS TGC 安全性問題

CAS 的安全性是一個非常重要的 Topic 。 CAS 從 v1 到 v3 ,都很依賴於 SSL ,它假定了這樣一個事實,用戶在一個非常不安全的網路環境中使用 SSO , Hacker 的 Sniffer 會很容易抓住所有的 Http Traffic ,包括通過 Http 傳送的密碼甚至 Ticket 票據。
TGC/PGT 安全性
對於一個 CAS 用戶來說,最重要是要保護它的 TGC ,如果 TGC 不慎被 CAS Server 以外的實體獲得, Hacker 能夠找到該 TGC ,然後冒充 CAS 用戶訪問所有授權資源。
SSO 的安全性問題比普通應用的安全性還要嚴重,因為 SSO 存在一種門檻效應。以前即使 Hacker 能夠截獲用戶在 Web 應用 A 的密碼,它也未必能知道用戶在 Web 應用 B 的密碼,但 SSO 讓 Hacker 只需要截獲 TGC( 突破了門檻 ) ,即能訪問所有與該用戶相關的所有應用系統。
PGT 跟 TGC 的角源寬冊色是一樣的,如果被 Hacker 獲得,後果可想而知。
從基礎模式可以看出, TGC 是 CAS Server 通過 SSL 方式發送給終端用戶,因此,要截取 TGC 難度非常大,從而確保 CAS 的安全性。
因此,某些人認為 CAS 可以不使用 SSL 的想法需要更正一下, CAS 的傳輸安全性僅僅依賴與 SSL 。
跟 Kerberos 一樣 TGT , TGC 也有自己的存活周期。下面是 CAS 的 web.xml 中,通過 grantingTimeout 來巧搜設置 CAS TGC 存活周期的參數,參數默認是 120 分鍾,在合適的范圍內設置最小值,太短,會影響 SSO 體驗,太長,會增加安全性風險。

<context-param>
<param-name>e.yale.its.tp.cas.grantingTimeout</param-name>
<param-value>7200</param-value>
</context-param>

TGC 面臨的風險主要並非傳輸竊取。比如你登陸了之後,沒有 Logout ,離開了電腦,別人就可以打開你的瀏覽器,直接訪問你授權訪問的應用 ) ,設置一個 TGC 的有效期,可以減少雹宏被別人盜用,或者被 Hacker 入侵你的電腦直接獲取你系統目錄下的 TGC Cookie 。
Service Ticket/Proxy Ticket 安全性
首要明白, Service Ticket 是通過 Http 傳送的,以為著所網路中的其他人可以 Sniffer 到其他人的 Ticket 。

CAS 協議從幾個方面讓 Service Ticket 變得更加安全。

l Service Ticket 只能使用一次。

CAS 協議規定,無論 Service Ticket 驗證是否成功, CAS Server 都會將服務端的緩存中清除該 Ticket ,從而可以確保一個 Service Ticket 被使用兩次。

l Service Ticket 在一段時間內失效。

假設用戶拿到 Service Ticket 之後,他請求 helloservice 的過程又被中斷了, Service Ticket 就被空置了,事實上,此時, Service Ticket 仍然有效。 CAS 規定 Service Ticket 只能存活一定的時間,然後 CAS Server 會讓它失效。通過在 web.xml 中配置下面的參數,可以讓 Service Ticket 在多少秒內失效。

<context-param>
<param-name>e.yale.its.tp.cas.serviceTimeout</param-name>
<param-value>300</param-value>
</context-param>

該參數在業務應用的條件范圍內,越小越安全。

l Service Ticket 是基於隨機數生成的。

Service Ticket 必須足夠隨機,如果 Service Ticket 生成規則被猜出(如果你使用了 ST+Helloservice+ 自增序列的方式, Hacker 就可以構造下一個 Ticket ), Hacker 就等於繞過 CAS 認證,直接訪問所有服務。

❷ 登錄那點事

client:提供用戶名和密碼或者是其他的認證憑證

server:驗證client提供的認證憑證,記錄登錄狀態

過程:訪問系統時,client必須輸入用戶名和密碼,server進行驗證,驗證通過後server建立一個叫做session的東西,然後把sessionId通過cookie發送給瀏覽器,下次登錄的時候會帶著cookie一起發過來,server從cookie中拿到sessionId就知道已經登錄啦。

 cookie和session的作用就是保持client和server的交互狀態,這樣一來可以將無狀態的通信轉化成有狀態的交互,也就是讓server有了「記憶」能力。

現在有三個服務,需要輸入三次用戶信息,但是如果有成百上千的服務呢?HOW???

參考上面簡單登錄的原理:服務端如何有了「記憶」能力呢:在client和server之間引入了一個中間層(cookie或者是session)。(題外話:計算機世界的99%的問題都可以通過一個引入一個中間層來解決)

所有我們可以想到一個可行的解決方案:對這個「中間層」做共享。

比如說先登錄了A,就有了一個cookie,然後在用cookie去登錄其他的系統。但是這樣明顯是有問題的:

1,cookie不能跨域,比如說a.com產生的cookie是不能傳遞給b.com的

2,就算cookie可以傳遞,但是其他系統並沒有session來校驗這個cookie。

解決方案:

1.cookie做共享可以掛到同一個一級域名下,比如A叫a.corp.com,B叫b.corp.com,C叫c.corp.com,這樣cookie不就能共享了嘛

2,將session也做共享,從內存裡面拿出來,放入一個大家都能訪問的中間層裡面,比如說redis。(題外話:又是中間層)

像下面這樣:

可以解決多系統登錄的問題么?可以解決!!! 但是

1,要共享cookie就必須讓所有的系統都在同一個域名下

2,多用戶賬號的存在。比如張三登錄了A,然後去登錄B,通過這種方式的話B需要去校驗張三這個用戶的合法性,此張三可能未必是彼張三!各個業務系統必須自己去維護自己系統的用戶,而且用戶信息還不止一個。

HOW????

Single Sign One :單點登錄

消除多用戶信息的問題,不用各個業務系統自己去維護用戶信息,建立一個統一的用戶認證中心(中間層:又是我哈哈哈),所有用戶的認證工作都交給這個認證中心來完成。各個子業務只需要負責實現自己的業務即可,不在需要關心用戶、認證等細節。

大致流程如下:

用戶第一次訪問A系統:www.a.corp.com,這個時候如果A發現用戶沒有登錄的話,那他需要做的一項操作就是重定向認證中心:www.sso.com/login?redirect=www.a.corp.com。

其中www.sso.com/login就是認證中心的登錄地址,redirect=www.a.corp.com就是登錄完成後需要跳轉到的地址。在認證中心登錄之後認證中心會做以下幾件事情:

1,建立一個session

2,發放ticket

3,重定向到你的地址,並在瀏覽器種下cookie信息。注意這個cookie是認證中心伺服器的cookie哦。如:ssoid=1,domain=sso.com

需要注意的有兩點:

1,進行了兩次重定向。第一次是重定向到SSO的伺服器,第二次是重定向我們的後端伺服器。

2,流程完成後再瀏覽器種了兩個cookie,一個是sso伺服器的cookie,一個是子系統A的cookie。

接下來我們訪問B系統:

這個時候會有三個cookie:

1,認證中心的cookie    domain:   sso.com  

2,A系統的cookie    domain: a.corp.com

3, B系統的cookie     domain: b.corp.com

本質上就是保存了一個認證中心的cookie和多個子系統的cookie。一般我們稱SSO的cookie的對應的會話成為全局會話,各自子系統cookie對應的會話稱為局部會話。

概述

CAS(Central Authentication Service) 是 Yale 大學發起的一個企業級的、開源的項目,旨在為 Web 應用系統提供一種可靠的單點登錄解決方法(屬於 Web SSO)。

CAS 開始於 2001 年, 並在 2004 年 12 月正式成為 JA-SIG 的一個項目。

特性

1、  開源的、多協議的 SSO 解決方案;Protocols:Custom Protocol、CAS、OAuth、OpenID、RESTful API、SAML1.1、SAML2.0 等。

2、  支持多種認證機制:Active Directory、JAAS、JDBC、LDAP、X.509 Certificates 等;

3、  安全策略:使用票據(Ticket)來實現支持的認證協議;

4、  支持授權:可以決定哪些服務可以請求和驗證服務票據(Service Ticket);

5、  提供高可用性:通過把認證過的狀態數據存儲在 TicketRegistry 組件中,這些組件有很多支持分布式環境的實現,如:BerkleyDB、Default 、EhcacheTicketRegistry、JDBCTicketRegistry、JBOSS TreeCache、JpaTicketRegistry、MemcacheTicketRegistry 等;

6、  支持多種客戶端: Java、 .Net、 PHP、 Perl、 Apache, uPortal 等。

體系結構 

從結構上看,CAS 包含兩個部分:CAS Server 和 CAS Client,CAS 需要獨立部署,主要負責對用戶的認證工作,CAS Server 會處理用戶名 / 密碼等憑證 (Credentials)。

負責處理對客戶端受保護資源的訪問請求,需要對請求方進行身份認證時,重定向到 CAS Server 進行認證。CAS Client一般與 與受保護的客戶端應用部署在一起,以 Filter 方式保護受保護的資源。過濾從客戶端過來的每一個 Web 請求,同時, CAS Client 會分析 HTTP 請求中是否包請求 Service Ticket

術語

 Ticket Granting ticket (TGT) :可以認為是CAS Server根據用戶名密碼生成的一張票,存在server端

Ticket-granting cookie (TGC) :其實就是一個cookie,存放用戶身份信息,由server發給client端

Service ticket (ST) :由TGT生成的一次性票據,用於驗證,只能用一次。相當於server發給client一張票,然後client拿著這是個票再來找server驗證,看看是不是server簽發的。就像是我給了你一張我的照片,然後你拿照片再來問我,這個照片是不是你。。。沒錯,就是這么無聊。

安全性

TGC安全性:

對於一個 CAS 用戶來說,最重要是要保護它的 TGC,如果 TGC 不慎被 CAS Server 以外的實體獲得,Hacker 能夠找到該 TGC,然後冒充 CAS 用戶訪問所有授權資源。從基礎模式可以看出, TGC 是 CAS Server 通過 SSL 方式發送給終端用戶,因此,要截取 TGC 難度非常大,從而確保 CAS 的安全性。TGT 的存活周期默認為 120 分鍾。

ST安全性:

ST(Service Ticket)是通過 Http 傳送的,因此網路中的其他人可以 Sniffer 到其他人的 Ticket。CAS 通過以下幾方面來使 ST 變得更加安全:

1、  ST 只能使用一次

CAS 協議規定,無論 Service Ticket 驗證是否成功, CAS Server 都會清除服務端緩存中的該 Ticket,從而可以確保一個 Service Ticket 不被使用兩次。

2、  ST 在一段時間內失效

CAS 規定 ST 只能存活一定的時間,然後 CAS Server 會讓它失效。默認有效時間為 5 分鍾。

3、  ST 是基於隨機數生成的

ST 必須足夠隨機,如果 ST 生成規則被猜出,Hacker 就等於繞過 CAS 認證,直接訪問對應的服務。

流程

上圖是3個登錄場景,分別為:第一次訪問www.qian.com、第二次訪問、以及登錄狀態下第一次訪問mail.qian.com。

第一次訪問www.qian.com

標號1: 用戶訪問http://www.qian.com,經過他的第一個過濾器:org.jasig.cas.client.authentication.AuthenticationFilter(cas提供,在web.xml中配置)。主要作用:判斷是否登錄,如果沒有登錄則重定向到認證中心

標號2: www.qian.com發現用戶沒有登錄,則返回瀏覽器重定向地址。

首先可以看到我們請求www.qian.com,之後瀏覽器返回狀態碼302,然後讓瀏覽器重定向到cas.qian.com並且通過get的方式添加參數service,該參數目的是登錄成功之後會要重定向回來,因此需要該參數。並且你會發現,其實server的值就是編碼之後的我們請求www.qian.com的地址。

標號3: 瀏覽器接收到重定向之後發起重定向,請求cas.qian.com。

標號4: 認證中心cas.qian.com接收到登錄請求,返回登陸頁面。

上圖就是標號3的請求,以及標號4的響應。請求的URL是標號2返回的URL。之後認證中心就展示登錄的頁面,等待用戶輸入用戶名密碼。

標號5: 用戶在cas.qian.com的login頁面輸入用戶名密碼,提交。

標號6 :伺服器接收到用戶名密碼,則驗證是否有效,驗證邏輯可以使用cas-server提供現成的,也可以自己實現。

上圖就是標號5的請求,以及標號6的響應了。當cas.qian.com即csa-server認證通過之後,會返回給瀏覽器302,重定向的地址就是Referer中的service參數對應的值。後邊並通過get的方式挾帶了一個ticket令牌,這個ticket就是ST(數字3處)。同時會在Cookie中設置一個CASTGC,該cookie是網站cas.qian.com的cookie,只有訪問這個網站才會攜帶這個cookie過去。

Cookie中的CASTGC:向cookie中添加該值的目的是當下次訪問cas.qian.com時,瀏覽器將Cookie中的TGC攜帶到伺服器,伺服器根據這個TGC,查找與之對應的TGT。從而判斷用戶是否登錄過了,是否需要展示登錄頁面。TGT與TGC的關系就像SESSION與Cookie中SESSIONID的關系。點擊這里了解Java如何操作Cookie。

TGT:Ticket Granted Ticket(俗稱大令牌,或者說票根,他可以簽發ST)

TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根據他可以找到TGT。

ST:Service Ticket (小令牌),是TGT生成的,默認是用一次就生效了。也就是上面數字3處的ticket值。

標號7 :瀏覽器從cas.qian.com哪裡拿到ticket之後,就根據指示重定向到www.qian.com,請求的url就是上面返回的url。

標號8 :www.qian.com在過濾器中會取到ticket的值,然後通過http方式調用cas.qian.com驗證該ticket是否是有效的。

標號9 :cas.qian.com接收到ticket之後,驗證,驗證通過返回結果告訴www.qian.com該ticket有效。

標號10 :www.qian.com接收到cas-server的返回,知道了用戶合法,展示相關資源到用戶瀏覽器上。

第二次訪問www.qian.com

標號11 :用戶發起請求,訪問www.qian.com。會經過cas-client,也就是過濾器,因為第一次訪問成功之後www.qian.com中會在session中記錄用戶信息,因此這里直接就通過了,不用驗證了。

標號12 :用戶通過許可權驗證,瀏覽器返回正常資源。

訪問mail.qian.com

標號13 :用戶在www.qian.com正常上網,突然想訪問mail.qian.com,於是發起訪問mail.qian.com的請求。

標號14 :mail.qian.com接收到請求,發現第一次訪問,於是給他一個重定向的地址,讓他去找認證中心登錄。

上圖可以看到,用戶請求mail.qian.com,然後返回給他一個網址,狀態302重定向,service參數就是回來的地址。

標號15 :瀏覽器根據14返回的地址,發起重定向,因為之前訪問過一次了,因此這次會攜帶上次返回的Cookie:TGC到認證中心。

標號16 :認證中心收到請求,發現TGC對應了一個TGT,於是用TGT簽發一個ST,並且返回給瀏覽器,讓他重定向到mail.qian.com

可以發現請求的時候是攜帶Cookie:CASTGC的,響應的就是一個地址加上TGT簽發的ST也就是ticket。

標號17 :瀏覽器根據16返回的網址發起重定向。

標號18 :mail.qian.com獲取ticket去認證中心驗證是否有效。

標號19 :認證成功,返回在mail.qian.com的session中設置登錄狀態,下次就直接登錄。

標號20 :認證成功之後就反正用想要訪問的資源了。

配置filter

  我們需要在應用的web.xml文件中配置四個Filter,這四個Filter必須按照固定的順序來進行配置,而且它們必須配置在應用的其它Filter之前。它們的先後順序要求如下:

1、AuthenticationFilter

casServerLoginUrl用來指定Cas Server登錄地址,serverName或service用來指定認證成功後需要跳轉地址。

2、TicketValidationFilter

      請求通過AuthenticationFilter的認證之後,如果請求中攜帶了參數ticket則將會由TicketValidationFilter來對攜帶的ticket進行校驗。 TicketValidationFilter只是對驗證ticket的這一類Filter的統稱,其並不對應Cas Client中的一個具體類型。Cas Client中有多種驗證ticket的Filter,

都繼承自,它們的驗證邏輯都是一致的,都有實現,不同的是使用的TicketValidator不一樣。這里我們使用Cas10TicketValidationFilter,也可以使用或Saml11TicketValidationFilter。

3、

 用於將每一個請求對應的HttpServletRequest封裝為其內部定義的CasHttpServletRequestWrapper,該封裝類將利用之前保存在Session或request中的Assertion對象重寫HttpServletRequest的getUserPrincipal()、getRemoteUser()和isUserInRole()方法。

      這樣在我們的應用中就可以非常方便的從HttpServletRequest中獲取到用戶的相關信息

4、AssertionThreadLocalFilter

AssertionThreadLocalFilter可以在應用的其它地方獲取Assertion對象,找個過濾器會把Assertion對象存放到當前的線程變數中,我們在程序的任何地方都可以從線程變數中獲取當前Assertion,就不需要再從Session或request中進行解析了。這個線程變數是由AssertionHolder持有的,我們在獲取當前的        Assertion時也只需要通過AssertionHolder的getAssertion()方法獲取即可

❸ 終於搞明白了,CAS單點登錄原理解析!!

真的如老話所說,「沒有笨的人,只有懶得人」。前段時間時間需要和其他項目做cas集成,於是乎在網上找了幾篇教程看了一下,好了,很簡單,學會了,開搞(自以為研究明白)。集成完事了,登錄成功了,自以為這就過去了。然而,沒過幾天就出bug了,這下慘了,當初沒有好好學出了問題都不知道咋解決。無奈,只得靜下心來好好學習一番(當初太懶付出的代價)。原理其實很簡單的,只要耐下心來好好研究終會搞懂的。

先看下圖

那麼是如何驗證用戶是否登錄過呢?

如果session中包含「 const_cas_assertion 」屬性,說明已經登錄,跳過此過濾器執行配置的其他過濾器;

如果ticket參數不為空(可能是登陸後跳轉回來的),跳過此過濾器,執行TicketValidationFilter 驗證ticket;

如果前兩個條件都不滿足,重定向到cas服務端,返回登錄頁面進行登錄操作。

Cookie中的CASTGC:向cookie中添加該值的目的是當下次訪問 www.cas.server.com 時,瀏覽器將Cookie中的TGC攜帶到伺服器,伺服器根據這個TGC,查找與之對應的TGT。從而判斷用戶是否登錄過了,是否需要展示登錄頁面。TGT與TGC的關系就像SESSION與Cookie中SESSIONID的關系。

TGT:Ticket Granted Ticket(俗稱大令牌,或者說票根,他可以簽發ST)。

TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根據他可以找到TGT。

ST:Service Ticket (小令牌),是虧吵喊TGT生成的,默認是用一次就生效了。也就是上面的銷野ticket值。

為了加深理解,也為了以後作參考,整理記錄。另外,還要說一句碰滑,不要偷懶,多動手多動腦!

❹ 為什麼有了tgt還要st

TGT是茄敬塵CAS為用戶簽發的登錄票據,擁有了TGT,用戶就可以證明自己在CAS成功登錄過。
TGT是CAS為用戶簽發的登錄ticket,也是顫禪用於驗證用戶登錄成功的唯一方式。TGT封裝了Cookie值以及Cookie值對應的用戶信息,CAS通過Cookie值(TGC)為key查詢緩存中有無TGT(TGC:TGT(key:value)),如果有的話就說明用戶稿旁已經登錄成。
ST是當用戶訪問某一服務時提供的ticket。用戶在訪問其他服務時,發現沒有cookie或ST,那麼就會302到CAS伺服器獲取ST。然後會攜帶著ST302回來。

❺ cas認證是什麼認證

CAS是CentralAuthenticationService的縮寫,中央認證服務,一種獨立開放指令協議。

CAS是Yale大學發起的一個開源項目,旨在為Web應用系統提供一種可靠的單點登錄方法,CAS在2004年12月正式成為JA-SIG的一個項目。

特點

1、開源的企業級單點登錄解決方案。

2、CASServer為需要獨立部署的Web應用。

3、CASClient支持非常多的客戶端(這里指單點登錄系統中的各個Web應用),包括Java,.Net,PHP,Perl,Apache,uPortal,Ruby等。

原理和協議

從結構上看,CAS包含兩個部分:CASServer和CASClient。CASServer需要獨立部署,主要負責對用戶的認證工作;

CASClient負責處理對客戶端受保護資源的訪問請求,需要登錄時,重定向到CASServer。圖是CAS最基本的協議過程:

CASClient與受保護的客戶端應用部署在一起,以Filter方式保護受保護的資源。對於訪問受保護資源的每個Web請求,CASClient會分析該請求的Http請求中是否包含ServiceTicket,

如果沒有,則說明當前用歲豎戶尚未登錄,於是將請求重定向到指定好的CASServer登錄地址,並傳遞Service(也就是要訪問的目的資源地址),以便登錄成功過後轉回該地址。

用戶在第3步中輸入認證信息,如果登錄成功,CASServer隨機產生一個相當長度、唯一、不可偽造的ServiceTicket,並緩存以待將來驗證,

之後系統自動重定向到Service所在地址,並為客戶端瀏覽器設置一個TicketGrantedCookie(TGC),

CASClient在拿到Service和新產生的Ticket過後,在第5,6步中與CASServer進行身份核實,以確保ServiceTicket的合法性。

在該協議中,所有與CAS的交互均採用SSL協議,確保,ST和TGC的安全性。協議工作過程中會有2次重定向的過程,但是CASClient與CASServer之間進行Ticket驗證的過程對於用戶是透明的。

另外,CAS協議中還提供了Proxy(代理)模式,以適應更加高級、復雜的應用場景,具體介紹可以參考CAS官方網站上的相關文檔。

(5)CAS50清除TGC緩存擴展閱讀

使用CAS在Tomcat中實現單點登錄中部署客戶端應用

單點登錄的目的是為了讓多個相關聯的應用使用相同的登錄過程,本文在講解過程中構造2個簡單的應用,分別以casTest1和casTest2來作為示例,它們均只有一個頁面,顯示歡迎信息和當前登錄用戶名。

這2個應用使用同一套登錄信息,並且只有登錄過的用戶才能訪問,通過本文的配置,實現單點登錄,即只需登錄一次就可以訪問這兩個應用。

與CASServer建立信任關系

假設CASServer單獨部署在一台機器A,而客戶端應用部署在機器B上,由於客戶端應用與CASServer的通信採用SSL,因此,需要在A與B的JRE之間建立信任關系。

首先與A機器一樣,要生成B機器上的證書,配置Tomcat的SSL協議。

其次,下載http://blogs.sun.com/andreas/entry/no_more_unable_to_find的InstallCert.java,運行「javaInstallCertcompA:8443」命令,

並且在接下來出現的詢問中輸入1。

這樣,就將A添加到了B的truststore中。如果多個客戶端應用分別部署在不同機器上,那麼每個機器都需要與CASServer所在機器建立信任關系。

配置CASFilter

准備好應用casTest1和casTest2過後,分別部署在B和C機器上,由於casTest1和casTest2,B和C完全等同,我們乎和大以casTest1在B機器上的配置做介紹,

假設A和B的域名分別為domainA和domainB。

將cas-client-java-2.1.1.zip改名為cas-client-java-2.1.1.jar並拷貝到casTest1/WEB-INF/lib目錄下,修棚春改web.xml文件,添加CASFilter,如清單10所示:

清單10.添加CASFilter

<web-app>...<filter>

<filter-name>CASFilter</filter-name>

<filter-class>e.yale.its.tp.cas.client.filter.CASFilter</filter-class>

<init-param>

<param-name>e.yale.its.tp.cas.client.filter.loginUrl</param-name>

<param-value>https://domainA:8443/cas/login</param-value>

</init-param>

<init-param>

<param-name>e.yale.its.tp.cas.client.filter.validateUrl</param-name>

<param-value>https://domainA:8443/cas/serviceValidate</param-value>

</init-param>

<init-param>

<param-name>e.yale.its.tp.cas.client.filter.serverName</param-name>

<param-value>domainB:8080</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>CASFilter</filter-name>

<url-pattern>/protected-pattern/*</url-pattern>

</filter-mapping>

...

</web-app>

對於所有訪問滿足casTest1/protected-pattern/路徑的資源時,都要求到CASServer登錄,如果需要整個casTest1均受保護,可以將url-pattern指定為「/*」。

從清單10可以看到,我們可以為CASFilter指定一些參數,並且有些是必須的,表格1和表格2中分別是必需和可選的參數:

表格1.CASFilter必需的參數

表格2.CASFilter可選參數

傳遞登錄用戶名

CAS在登錄成功過後,會給瀏覽器回傳Cookie,設置新的到的ServiceTicket。但客戶端應用擁有各自的Session,我們要怎麼在各個應用中獲取當前登錄用戶的用戶名呢?

CASClient的Filter已經做好了處理,在登錄成功後,就可以直接從Session的屬性中獲取,如清單11所示:

清單11.在Java中通過Session獲取登錄用戶名

1//以下兩者都可以

2session.getAttribute(CASFilter.CAS_FILTER_USER);

3session.getAttribute("e.yale.its.tp.cas.client.filter.user");

在JSTL中獲取用戶名的方法如清單12所示:

清單12.通過JSTL獲取登錄用戶名

1<c:outvalue="${sessionScope[CAS:'e.yale.its.tp.cas.client.filter.user']}"/>

另外,CAS提供了一個CASFilterRequestWrapper類,該類繼承自HttpServletRequestWrapper,主要是重寫了getRemoteUser()方法,

只要在前面配置CASFilter的時候為其設置「e.yale.its.tp.cas.client.filter.wrapRequest」參數為true,就可以通過getRemoteUser()方法來獲取登錄用戶名,具體方法如清單13所示:

清單13.通過CASFilterRequestWrapper獲取登錄用戶名

=newCASFilterRequestWrapper(request);

2out.println("Thelogonuser:"+reqWrapper.getRemoteUser());

❻ 【單點登錄】CAS協議

CAS協議是專門為CAS開發的一種簡單而強大的基於票據的協議。

CAS涉及到一個或多個客戶端與一個服務端,客戶端嵌入CASified應用程序(稱為「CAS服務」),而CAS伺服器是一個獨立組件:

1.CAS伺服器負責對用戶進行身份驗證並授予對應用程序的訪問權

2.CAS客戶端保護CAS應用程序,並從CAS伺服器檢索被授予用戶的標識。

關鍵概念:

1.存儲在CASTGC cookie中的 TGT (票據授予票據)表示用戶的一個SSO session。

2. ST (服務票證)作為url中的GET參數傳輸,表示由CAS伺服器為特定用戶授予認證應用程序的訪問許可權。

WEB流程:

1.用戶訪問目標應用程序,通過瀏覽器發送GET請求到目標應用

2.目標應用檢測到用戶未認證,則轉發請求到CAS服務端,帶上查詢參數service,值為目標應用地址。

3.CAS服務端檢測用戶發現沒有SSO session 則返回CAS登錄頁面。

4.用戶在CAS登錄頁面填寫登錄表單,提交進行認證。

5.認證成功後CAS服務端創建SSO session,並創態攜建TGT票據到Cookie中 (Set-Cookie:CASTGC=TGT-xxxxxx),並重定向到目標應用程序帶上查詢參數ticket=ST-xxxxx。

6.目標應用發送請求向CAS伺服器驗證ST票據,驗證成功後目標應用創建用戶訪問session,並把sessionID放入cookie中。

7.用戶訪敗閉悄問目標應用通過sessionID獲取到session,登陸成功。

8.用戶訪問其他CAS客戶端應用,其他CAS客戶端重定向請求到CAS伺服器,同步驟2。

9.CAS伺服器檢測到用戶TGT這個cookie,獲取到SSO session,直接認證成功,並重定向到目標應用程序帶上查詢參數ticket=ST-xxxxx。

10.同步驟6,察渣7,成功登陸其他CAS客戶端應用。

❼ 2022-03-10 CAS認證流程

CAS認證流程圖:

(1) 用戶通過瀏洞弊覽器訪問指定瞎和頁面;

(2) 頁面對應的後台進行安全校驗:檢查service-ticket和access token是否存在,若不存在,則 重定向 到CAS伺服器 /cas/login/;

(3) CAS服務納神族器要求用戶提供SSO登錄憑證;

(4) 用戶提供用戶名和密碼給CAS伺服器;

(5) CAS伺服器將service ticket和 service URL返回給後台;

(6) 後台發送驗證請求給CAS伺服器檢驗service ticket和service URL是否匹配;

(7) 若後台得到service ticket和service URL匹配,返回前台瀏覽器,TGC一並存儲到瀏覽器中;

(8) 瀏覽器訪問指定頁面;

❽ 從http驗證流程解析CAS單點登錄

JAVA單點登錄有好多種方式,譬如用cookie的domain做,用中間代理做等等,但都需要自行做許多開發工作。而其中耶魯大學的開源項目CAS提供了一個一站式解決方案,只需很少的擴展即可輕松實現企業級單點登錄。基礎知識網上其他挺多的,這里我就不詳述了。本文通過分析http請求過程中http header,cookie等數據剖析了cas( 非代理模式,默認驗證邏輯。其他如restletAPI等可擴展邏輯本文不會覆蓋 )的驗證流程,在開發調試中提供了另一種方便的方式掌控整個流程的關鍵點 。

TGT:  cas服務端生成的每個用戶唯一的ticket。

TGC:  cas服務端根據TGT生成的每個用戶的cookie,其value是TGT。

ST:    cas服務端根據每個應用,每個用戶生成的一個ticket,驗證一次就銷毀。

Shiro: JAVA許可權管理框架

下面將通過兩個客戶端應用A、B分別跟cas server端交互來詳述整個交互流程。本文基於CAS 4.x。 CAS 5.X默認邏輯一致,只不過通過spring boot進行了重新模塊劃分。

Cas client攔截請求發現session中無cas assertion(其實就是用戶名和ticket)並且沒有ST則跳轉CAS server(本項目由於用了shiro重寫攔截邏輯所以是判斷shiro中有沒有保存驗證後的用戶信息), server端發現無TGC跳轉配置的CAS登陸URL

Response返回302指示重定向。同時可見response返回兩個cookie: CASPRIVACY=和CASTGC= TGT-1--cas01.example.org

也就是說:cas server端驗證通過後產生ST並在location URL後面賦給ticket。此時往客戶端瀏覽器寫入TGC,並且指示瀏覽器重定向到location位置,其正是客戶端應用驗證ST的路徑。

此步驟產生2個ticket: TGT,ST;產生一個cookie:TGC,此cookie是通過用戶私密信息與TGT加密生成。

此時客戶端應用由於受到shiro的保護,request cookie中就不是JSESSIONID而是shiro的SessionId:sid,uuid模式,其與第一步中的sid一致。

Response返回302指示重定向到另一個頁面(第一次訪問的頁面或者shiro配置的successful url),同時可見生成了新的session和sessionID。同時可見response返回2個cookie:  JSESSIONID,為servlet容器產生的session id,其為location中的jsessionid;rememberMe,為shiro為自動登錄配置的。

此步驟驗證ST後(通過url connection去cas server驗證ST)如果通過則重定向到新頁面(第一次訪問的頁面或者shiro配置的successful url)產生一個新的容器session id。(為何要重新創建session,因為其會在新的session中保存登陸了客戶端應用的憑證CAS Assertion,其為客戶端驗證ST後返回的)到了這步驟以後屬於客戶端自身的邏輯。CAS作用到此為止。

可以看到這次直接就訪問了,也沒有經過驗證ticket和與cas服務端交互。此是因為session中已經保存了cas assertion,所以算作登陸了。

可見產生了新的shiro session,並提示跳轉CAS服務端登陸URL。

可見並沒有要求登陸而是直接就提示跳轉到location的URL做驗證並產生了一個新的ST。這是因為CAS服務端讀取了A應用登陸後在瀏覽器生成的TGC, request cookie中帶入了(下圖可以看到),從而認為用戶已經登陸,所以直接生成ST,並要求重定向到客戶端應用B去驗證。

步驟同A應用。

如圖

如下圖:

可見登出時發生四次請求。

直接訪問CAS server端的登出url。Cookie中有CASTGC和server端的JSESSIONID。

返回中CASTGC清空,CASPRIVACY清空。 此時說明server端已經清除了A應用的ST和瀏覽器的CASTGC

跳轉到了客戶端應用,發現新創建了shiro session(sid)和servlet容器session(JSESSIONID)

並且發現rememberMe和SID的cookie都被換成deleteMe啦。 此為shiro的loginout攔截器乾的好事。

正常訪問首頁,但是因為沒登陸所以提示要重定向到CAS服務端去登陸。(如果有了首頁就改為跳轉到首頁)

同原來步驟。

總的來說,cas (非代理模式,默認驗證邏輯) 是用一個cookie(TGC), N個session(N個子系統session,其中存儲了cas receipt)來保證各應用的統一登錄。