阅读本文前,建议优先阅读 Apereo Cas 6.x 官方文档,以便对Cas的整体实现和业务流程有更详细的了解!

CAS

​ CAS,Central Authentication Service,中央认证服务,由Yale发起的开源项目,旨在为Web应用提供一种可靠的单点登录方法。

  • CAS Server 负责对用户的认证。
  • CAS Client 负责提供资源,当资源受保护时需要用户进行身份认证时,重定向到CAS Server进行认证。

例如:通过微信账号登录小程序,微信为 CAS Server,小程序为 CAS Client

CAS protocol

Ticket

TGT:Ticket Grangting Ticket

​ 为用户签发的登录票据,其中封装了Cookie的值(Cookie值中包含用户信息),用户CAS认证通过后,CAS Server生成TGT存储在缓存中,并生成TGC(Ticket Grangting Cookie)理解为sessionId,写入浏览器。HTTP请求到达时,会验证是否包含TGC,包含则以此为key在缓存中查找TGT,如果有说明用户登录过并且未过期,如果没有需要重新登录。
TGC:Ticket Grangting Cookie

​ 上面提到的TGT存入缓存中,而TGC即为缓存标识,通过TGC寻找到TGT。
ST:Service Ticket

​ 用户访问某一Service的票据。当用户调用CAS Client某一Service时,会验证用户是否含有ST,如果没有,则要求用户到CAS Server获取ST,如果用户请求中包含TGC,则CAS会以此查找缓存中的TGT,如果存在TGT,则用此TGT签发ST,返回给用户。用户凭借ST再次访问该Service,Service携带ST到CAS Server进行验证,验证通过后允许用户访问资源。

​ 为了保证安全,ST是随机生成的,另外,CAS规定,CAS只能存活一定的时间,并且规定ST只能使用一次,无论ST是否验证成功,CAS Server都会清除服务端缓存中的该Ticket,保证同一个ST不能被使用两次。
认证过程(参考下图)

第一步:

​ 1、用户请求客户端,客户端验证本地Session没有该用户信息。

​ 2、客户端检测到此次请求中没有ST。

​ 3、客户端返回给用户Redirect响应,到CAS Server,携带service参数,例如:

​ 302 Location : https://cas.example.com/cas/login?service=http0%3A8081%2F

第二步:

​ 1、CAS Server检测到该次请求中不包含TGC,跳转到登录页。

​ 2、用户输入用户名密码进行登录认证,成功后CAS Server生成TGT(集成用户信息及ST),并随机生成TGC,将TGC写入Cookie。

​ 3、CAS Server返回给用户Redirect响应,到service中的地址,携带ST参数及包含TGC的Cookie,例如:

​ Set-Cookie : CASTGC=TGT-2345678

​ 302 Location : http://baidu.com/web1?ticket=ST-5-Sx6eyvj7cPPCfn0pMZ

第三步:

​ 1、用户携带ticket(ST)再次请求CAS Client,客户端Authentication Filter检测到请求中带有ticket参数,会跳过,由Ticket Validation Filter处理。

​ 2、Ticket Validation Filter 携带ticket(ST)及service访问CAS Server的/serviceValidate接口,希望CAS Server验证ST有效性。

​ 3、CAS Server验证成功,将用户信息通过xml方式返回给Ticket Validation Filter,当该Filter接收到验证成功的响应时,把用户信息存入缓存。至此,SSO会话成功建立。

第四步:

​ 1、Client将用户信息存入缓存,并生成SessionId写入cookie,返回给用户Redirect响应,到用户请求的服务地址。例如:

​ Set-Cookie : JSESSIONID=ABC123456

​ 302 Location : http://baidu.com/web1

​ 2、用户接下来的访问只需要验证SessionId即可,无需再向CAS Server请求验证。

当用户访问同一个CAS Server但是不同的CAS Client时:

​ 1、同样CAS Client2检测缓存中没有该次请求的用户信息,没有ST,Client2返回给用户Redirect响应,携带service参数,到CAS Server。

​ 2、这是用户第二次访问CAS Server,此时Request的Cookie中会携带第一次签发的TGC,CAS Server根据TGC查找缓存中是否有对应的TGT,例如:

​ Set-Cookie : CASTGC=TGT-2345678

​ 302 Location : https://cas.example.com/cas/login?service=http://app.com/web

​ 3、如果有,说明用户登录过且未过期,用户不必再次登陆,CAS Server会直接找到TGT签发ST,返回给客户端Redirect响应,到service中的地址,例如:

​ Set-Cookie : CASTGC=TGT-2345678

​ 302 Location : http://app.com/web?ticket=ST-8-SoIdlj7cPPCfn0pMZ

​ 4、用户携带ticket(ST)再次请求CAS Client,客户端Authentication Filter检测到请求中带有ticket参数,会跳过,由Ticket Validation Filter处理。

​ 5、Ticket Validation Filter 携带ticket(ST)及service访问CAS Server的/serviceValidate接口,希望CAS Server验证ST有效性。

​ 6、CAS Server验证成功,将用户信息通过xml方式返回给Ticket Validation Filter,当该Filter接收到验证成功的响应时,把用户信息存入缓存。至此,SSO会话成功建立。

​ 7、Client将用户信息存入缓存,并生成SessionId写入cookie,返回给用户Redirect响应,到用户请求的服务地址。例如:

​ Set-Cookie : JSESSIONID=ABC123456

​ 302 Location : http://app.com/web

​ 8、用户接下来的访问只需要验证SessionId即可,无需再向CAS Server请求验证。
总结

​ CAS认证过程中的核心概念即是几个票据,实际上其实就是1个Cookie和N个Session。包括CAS1.0(基础模式)的TGT、ST、TGC;以及CAS2.0(代理模式)的PGT、PT、PGTIOU等。认证过程,即是这几个票据的传递与对比验证的过程。

作者:Jeebiz  创建时间:2019-11-01 14:22
最后编辑:Jeebiz  更新时间:2024-05-06 16:13