基于 CAS 的 SSO

1,336 阅读5分钟

什么是 SSO

SSO 是 Single Sign On 的缩写,翻译成中文就是单点登录。单点登录使得用户只需要登录一次,就可以访问所有相互信任的应用系统。IBM 对于 SSO 有一个形象的解释,“单点登录,全网漫游”。目前许多企业已经将单点登录作为系统设计的基本功能之一。

SSO 的优点

  • 提升用户体验。进行一次登录,就能在多个系统中进行透明跳转;
  • 避免重复开发登录鉴权逻辑
  • 安全的同时避免处理和保存多套系统用户的认证信息

什么是 CAS

CAS 是 Central Authentication Service 的缩写,是由 Yale 大学发起的一个企业级的开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。

CAS 的原理

术语

  • Client: 用户
  • Server: 中心服务器,负责单点登录的服务器
  • Service: 需要使用单点登录的各个服务,各个系统。

核心票据

1、TGT:Ticket-Granting Ticket

TGT 是 CAS 为用户签发的登录票据,TGT 封装了 Cookie 值以及此 Cookie 值对应的用户信息。用户在 CAS 认证成功后, CAS 生成 cookie,写入浏览器,同时生成一个 TGT 对象,放入自己的缓存,TGT 对象的 ID 就是 cookie 的值。当 HTTP 再次请求时,如果有携带 CAS 生成的 cookie,则 CAS 以此 cookie 值为 key 查询缓存中有无 TGT,如果有,则判断用户之前登录过,如果没有,则判断没有登录。

2、ST:Service Ticket

ST 是 CAS 为用户签发的访问某一 service 的票据。用户访问 service 时,service 发现没有 ST,则要求用户去 CAS 服务器获取 ST。用户向 CAS 发出获取 ST 的请求, 如果用户的请求包含 cookie,则 CAS 会以此 cookie 为 key 查询缓存中有无 TGT。如果存在 TGT,则此 TGT 签发一个 ST,返回给用户。用户凭借 ST 去访问 service, service 拿 ST 去 CAS 服务器验证,验证通过后,允许用户访问该资源。

TGT、ST 之间的关系

ST 是 TGT 签发的。用户在 CAS 上认证成功后,CAS 生成 TGT,用 TGT 签发一个 ST,ST 的 ticketGrantingTicket 属性值就是 TGT 对象,然后把 ST 的值 redirect 到客户应用。

体系结构

从结构体系看,CAS 包括两部分:CAS Server 和 CAS Client。 CAS SerVer 负责完成对用户的认证工作,通过给用户签发两个重要的票据:登录票据(TGT)和服务票据(ST,Service Ticket)来实现认证过程,CAS Server 需要独立部署。 CAS Client 负责处理对客户端受保护资源的访问请求,对请求方进行身份认证时,重定向到 CAS Server 进行认证。准确来说,它以 Filter 方式保护受保护的资源。 对与访问受保护资源的每个 Web 请求,CAS Client 会分析该 HTTP 请求中是否包含 Service Ticket。CAS Client 与受保护的客户端应用部署在一起。

主要原理

基本过程: CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护 Web 应用的受保护资源,过滤对客户端的每一个 Web 请求。

  • 第一步,Web 浏览器访问 CAS Client,无 session 并且无票据(ST),于是定向到 CAS Server。
  • 第二步,CAS Server 检查到没有携带相关的 cookie,故服务端拿不到 TGC, 因此定向到登录页面,让用户登录。
  • 第三步,用户输入正确的用户名和密码,认证成功。 CAS 生成 cookie,写入浏览器,同时生成一个 TGT 对象,再根据 TGT 发放票据 ST,并且附带上 ST 重定向到 CAS Client。
  • 第四补,CAS Client 拿着 ST 向 CAS 发送请求确认 ST 的真实性,验证成功返回用户信息.

详细过程:

  • 1、用户访问 CAS Client a, 域名是 www.a.cn
  • 2、由于用户没有携带在 a 服务器上登录的 a cookie,所以 a 服务器返回 http 重定向,重定向的 url 是 CAS Service 的地址。同时 url 中的 query 参数中指明登录成功后,跳转回 www.a.cn。
  • 3、由于该请求没有携带在 CAS Service 上登录的凭证 TGC,所以 CAS Service 判断用户未登录,给用户显示登录界面。
  • 4、用户输入账号密码验证成功后,CAS Service 服务器生成一个该用户的 TGT,表明该用户已登录,同时返回一个 http 重定向到 a 页面,在重定向地址的 query 中包含 Service 根据 TGC 派发的 ST,重定向的 http response 中包含写 cookie 的 header。这个 cookie 的值是 TGC。
  • 5、根据 ST,a 服务器向 CAS Service 发送请求验证票据的有效性。验证成功后,a 服务器确认用户已经在 CAS Service 登录了,于是 a 服务器构建用户登录的 session,记为 a session。并将 cookie 写入浏览器。此处的 cookie 和 session 保存的是用户在 a 服务器的登录状态,和 CAS 无关。
  • 6、用户又访问 CAS Client b, 域名是 www.b.cn
  • 7、由于用户没有携带在 b 服务器上登录的 b cookie,所以 b 服务器返回重定向到 CAS Service
  • 8、重定向到 CAS Service,由于在第 4 步中,我们已经向浏览器写入了 TGC 的 cookie,所以此时 CAS Service 根据 cookie 去查找 TGT,可以找到就判断用户已经登录过,重定向到 www.b.cn
  • 9、b 服务器根据票据向 SSO 服务器发送请求,票据验证通过后,b 服务器知道用户已经在 sso 登录了,于是生成 b session,向浏览器写入 b cookie。