CAS(Central Authentication Service)单点登录系统是一种常见的身份验证和授权解决方案,它可以让用户在一个认证中心(CAS服务器)上登录,然后使用此登录信息访问多个应用程序而无需再次登录。
先了解几个名词:
TGC
:(Ticket-granting Cookie),存放 SSO 用户身份凭据的 Cookie,类似 JSESSIONID。TGT
:(Ticket Granting Ticket),在 SSO 中标识一位用户,类似 Session。ST
:(Service Ticket),作为一个参数跟在 url 后面, 代表 CAS 为某一用户访问 CAS 客户端签发的凭据。
The TGT (Ticket Granting Ticket), stored in the TGC cookie, represents a SSO session for a user. The ST (Service Ticket), transmitted as a GET parameter in urls, stands for the access granted by the CAS server to the CASified application for a specific user.
登录时序图
红色字体是我添加的翻译 ,可能不够准确,仅供参考
首次认证流程
按上述步骤启动 CAS 相关应用后,打开浏览器,访问 https://localhost:9443/sample/
,输入口令完成登录,在 Fiddler 中过滤无关请求,需要学习的请求如图。
-
序号 930,第一次访问
https://localhost:9443/sample/
,会经过 CAS 提供的过滤器org.jasig.cas.client.authentication.AuthenticationFilter
,过滤器判断到当前用户没有登录,将请求重定向到认证中心,如图;
重定向的地址是在过滤器参数中配置的
casServerLoginUrl
,service
参数值则是过滤器参数中配置的serverName
,即认证后要跳转的地址。 -
序号 932,CAS 服务器接收到登录请求,返回登录页面;
-
序号 956,用户输入口令后提交登录,CAS 服务器验证用户名密码是否有效(这里使用静态认证),如图;
使用
POST
请求的方式提交登录表单,用户认证成功后,请求的响应码是 302,指示浏览器将请求重定向到最开始访问的地址。重定向的地址通过 querySpring 携带了一个ticket
参数。同时会设置一个名为TGC
的 Cookie,路径为/cas/
。下次访问https://cas.server.com:8443
时会携带这个 Cookie,服务器可以根据这个TGC
,查找与之对应的TGT
,从而判断用户是否认证过,是否需要展示登录页面。TGT 与 TGC 的关系就像 SESSION 与 Cookie 中 JSESSIONID 的关系
; -
序号 957,浏览器向
https://localhost:9443/sample/
发起请求,请求携带 CAS 服务器签发的ST
,localhost:9443
在过滤器中获取到 ticket 值,通过 HTTP 请求的方式调用 CAS 服务验证该 ticket 是否有效,过滤器全称org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter
,验证方法在org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator#validate
, 如图。
此时,CAS 服务器的日志如下图。
localhost:9443
收到 CAS 服务器返回,知道用户合法,即可正常响应请求,展示页面,如图。
- 序号 958,
ST
验证通过后再次重定向是在Cas30ProxyReceivingTicketValidationFilter
过滤器中使用了redirectAfterValidation
参数(默认为true
),将其配置成false
即可在验证用户后返回正常页面,如图。
再次认证流程
第一次访问 localhost:9443
的步骤已梳理完成,保持用户在 SSO 的会话,尝试访问 localhost:7443
,观察其流程。请求重定向到 CAS 服务器时,携带了值为 TGC
的 Cookie。CAS 服务器通过此 TGC
查找到对应的 TGT
,判断到用户已经登录,便不再展示登录页面,即少了 CAS 服务器登录这个步骤,剩余步骤和首次登录一致,如图。
CAS单点登录的实现原理
-
用户访问需要身份验证的应用程序,并尚未进行身份验证。
-
应用程序重定向用户到CAS服务器进行登录验证。
-
CAS服务器检查用户的登录凭据,如果验证通过,则创建一个票据(ticket)。
-
CAS服务器将票据发送回应用程序,并将用户重定向回应用程序。
-
应用程序接收票据,并将其发送回CAS服务器以进行验证。
-
如果票据有效,则CAS服务器返回身份验证成功的响应。
-
应用程序将用户身份验证信息保存在会话中,以便以后的访问。
-
如果用户尝试访问其他应用程序,则该应用程序将使用相同的步骤验证用户身份。
因此,CAS单点登录系统的主要思想是将用户身份验证过程与应用程序分离开来,使得用户只需进行一次登录验证,就可以访问多个应用程序。CAS系统将所有的登录信息存储在一个中心化的认证中心中,使得其他应用程序可以通过该中心获取用户的身份验证信息,从而实现单点登录的功能。