SSO 单点登陆 ——CAS实现方式

本文大量参考了一篇文章,包括用图,http://www.coin163.com/java/c...html

SSO(Single Sign On)是在多个应用系统中,用户只需登陆一次就能够访问全部相互信任的应用系统。java

基础协议

clipboard.png

角色与职责

CAS实现方式有3个角色,用户浏览器,CASClient,CASServer。CASClient对于用户浏览器而言是一个Server,对于CASServer而言是一个Client。用户浏览器是终端用户,是SSO的使用者,CASClient是前置用户验证系统,用于验证用户的合法性只有经过了CAS验证的用户,才能进一步访问后边真正的资源。浏览器

验证过程

  1. CASClient与受保护的应用部署到一块儿,假设CASClientA对应着Web应用A,CASClientB对应Web应用B。缓存

  2. 浏览器访问Web应用A,CASClient查看用户是否登陆过,这里的一种判断方式是使用Session保存TK,发现访问没有TK或者TK不对就重定向到CASServer。TK的来源在下边讲。安全

  3. 浏览器重定向到了CASServer那里,这里浏览器是带着CASServe域的Cookie的,CASServer能够经过Cookie判断用户是否登陆过,也就是TGC(来源也在后边的步骤里)。发现也没有登陆过,就返回登陆页面。服务器

  4. 浏览器输入用户名密码,CASServer验证经过后,生成一个惟一的不可伪造的Key,叫作ServiceTicket,简称TK。而后,一方面CASServer将这个TK记下来,以备后续的验证使用,另外一方面,给浏览器A设置一个Ticket Granted Cookie,简称TGC。而后重定向浏览器A到CASClient的地址,带上参数TK。因此TK和TGC都是CASServer生成的。cookie

  5. CASClient收到了TK以后,拿到CASServer那里去验证。验证经过后,CASServer返回用户相关信息。优化

  6. CASClient拿到用户信息后,设置Session,而后放请求到业务Server处理。spa

  7. 浏览器访问Web应用B,CASClientB也要检查用户是否登陆,发现没有登陆,将浏览器重定向到CASServer。设计

  8. 浏览器访问CASServer的时候,Cookie中是设置了TGC了的,因而CASServer不用返回登陆页面,直接将TGC对应的TK返回给浏览器并重定向到CASClientB,CASClientB向CASClientServer验证后,拿到用户信息,设置Session,放行服务。实现了SSO。

更复杂的场景

用户访问App1,App1又依赖于App2来获取一些信息。这种状况下,App2也是要对用户身份进行验证的,本质上可使用屡次重定向实现。即,App1的验证经过后,访问App2的服务,还要重定向到CASServer,而后再重定向到App2,而后在重定向回到App1。为了优化用户体验,可使用CAS的代理模式。用CASClient1代理用户进行App2的身份验证。

clipboard.png

  1. 在验证ST的时候,额外提供一个PGTURL(Proxy Granted Ticket),这个URL入口是SSL的。

  2. CASServer回调PGTURL,给CASClient一个PGT串。

  3. 须要使用App2资源的时候,CASClient用PGT串到CASServer那里换取PT,PT是根据PGT和要使用的Service(这里是App2)来生成的。因此使用不一样的Service会有不一样的PT。

  4. CASClient用PT访问App2的资源

  5. App2的CASClient拿着PT再去Server那里验证权限

  6. 验证经过后将资源返回给App1的CASClient

  7. App1提供服务后将数据返回给浏览器。

代理认证过程以下:
clipboard.png

代理认证的思路和客户端认证的思路是同样的,就是返回不一样的串,增长了一层复杂性。

CAS 系统中设计了 5 中票据: TGC 、 ST 、 PGT 、 PGTIOU 、 PT 。

  1. Ticket-granting cookie(TGC) :存放用户身份认证凭证的 cookie ,在浏览器和 CAS Server间通信时使用,而且只能基于安全通道传输( Https ),是 CAS Server 用来明确用户身份的凭证;

  2. Service ticket(ST) :服务票据,服务的唯一标识码 , 由 CAS Server 发出( Http 传送),经过客户端浏览器到达业务服务器端;一个特定的服务只能有一个唯一的 ST ;

  3. Proxy-Granting ticket ( PGT ):由 CAS Server 颁发给拥有 ST 凭证的服务, PGT 绑定一个用户的特定服务,使其拥有向 CAS Server 申请,得到 PT 的能力;

  4. Proxy-Granting Ticket I Owe You ( PGTIOU ) : 做用是将经过凭证校验时的应答信息由 CAS Server 返回给 CAS Client ,同时,与该 PGTIOU 对应的 PGT 将经过回调连接传给 Web 应用。 Web 应用负责维护 PGTIOU 与 PGT 之间映射关系的内容表;

  5. Proxy Ticket (PT) :是应用程序代理用户身份对目标程序进行访问的凭证。

安全性

CAS最重要的是保护TGC的安全性,若是TGC被CASServer之外的实体拿到,那么若是Hacker找到TGC,就能够冒充登陆用户了。因为TGC是CASServer经过SSL方式发送给终端用户的,所以截获的难度至关大,从而能确保CAS的安全性。

ST只能使用一次,因为ST是HTTP传输的,因此是能够被截获的,一次CAS协议规定,不管ST的验证是否成功,CASServer都会清除服务端的ST缓存。从而确保ST不会被使用两次。CAS还规定,ST只能存活一段时间。而后CASServer就会让他失效。另外,ST必须足够随机。