本文大量参考了一篇文章,包括用图,http://www.coin163.com/java/c...
SSO(Single Sign On)是在多个应用系统中,用户只需登录一次就可以访问所有相互信任的应用系统。
基础协议
角色与职责
CAS实现方式有3个角色,用户浏览器,CASClient,CASServer。CASClient对于用户浏览器而言是一个Server,对于CASServer而言是一个Client。用户浏览器是终端用户,是SSO的使用者,CASClient是前置用户验证系统,用于验证用户的合法性只有通过了CAS验证的用户,才能进一步访问后边真正的资源。
验证过程
CASClient与受保护的应用部署到一起,假设CASClientA对应着Web应用A,CASClientB对应Web应用B。
浏览器访问Web应用A,CASClient查看用户是否登录过,这里的一种判断方式是使用Session保存TK,发现访问没有TK或者TK不对就重定向到CASServer。TK的来源在下边讲。
浏览器重定向到了CASServer那里,这里浏览器是带着CASServe域的Cookie的,CASServer可以通过Cookie判断用户是否登录过,也就是TGC(来源也在后边的步骤里)。发现也没有登录过,就返回登录页面。
浏览器输入用户名密码,CASServer验证通过后,生成一个唯一的不可伪造的Key,叫做ServiceTicket,简称TK。然后,一方面CASServer将这个TK记下来,以备后续的验证使用,另一方面,给浏览器A设置一个Ticket Granted Cookie,简称TGC。然后重定向浏览器A到CASClient的地址,带上参数TK。所以TK和TGC都是CASServer生成的。
CASClient收到了TK之后,拿到CASServer那里去验证。验证通过后,CASServer返回用户相关信息。
CASClient拿到用户信息后,设置Session,然后放请求到业务Server处理。
浏览器访问Web应用B,CASClientB也要检查用户是否登录,发现没有登录,将浏览器重定向到CASServer。
浏览器访问CASServer的时候,Cookie中是设置了TGC了的,于是CASServer不用返回登录页面,直接将TGC对应的TK返回给浏览器并重定向到CASClientB,CASClientB向CASClientServer验证后,拿到用户信息,设置Session,放行服务。实现了SSO。
更复杂的场景
用户访问App1,App1又依赖于App2来获取一些信息。这种情况下,App2也是要对用户身份进行验证的,本质上可以使用多次重定向实现。即,App1的验证通过后,访问App2的服务,还要重定向到CASServer,然后再重定向到App2,然后在重定向回到App1。为了优化用户体验,可以使用CAS的代理模式。用CASClient1代理用户进行App2的身份验证。
在验证ST的时候,额外提供一个PGTURL(Proxy Granted Ticket),这个URL入口是SSL的。
CASServer回调PGTURL,给CASClient一个PGT串。
需要使用App2资源的时候,CASClient用PGT串到CASServer那里换取PT,PT是根据PGT和要使用的Service(这里是App2)来生成的。所以使用不同的Service会有不同的PT。
CASClient用PT访问App2的资源
App2的CASClient拿着PT再去Server那里验证权限
验证通过后将资源返回给App1的CASClient
App1提供服务后将数据返回给浏览器。
代理认证过程如下:
代理认证的思路和客户端认证的思路是一样的,就是返回不同的串,增加了一层复杂性。
CAS 系统中设计了 5 中票据: TGC 、 ST 、 PGT 、 PGTIOU 、 PT 。
Ticket-granting cookie(TGC) :存放用户身份认证凭证的 cookie ,在浏览器和 CAS Server间通讯时使用,并且只能基于安全通道传输( Https ),是 CAS Server 用来明确用户身份的凭证;
Service ticket(ST) :服务票据,服务的惟一标识码 , 由 CAS Server 发出( Http 传送),通过客户端浏览器到达业务服务器端;一个特定的服务只能有一个惟一的 ST ;
Proxy-Granting ticket ( PGT ):由 CAS Server 颁发给拥有 ST 凭证的服务, PGT 绑定一个用户的特定服务,使其拥有向 CAS Server 申请,获得 PT 的能力;
Proxy-Granting Ticket I Owe You ( PGTIOU ) : 作用是将通过凭证校验时的应答信息由 CAS Server 返回给 CAS Client ,同时,与该 PGTIOU 对应的 PGT 将通过回调链接传给 Web 应用。 Web 应用负责维护 PGTIOU 与 PGT 之间映射关系的内容表;
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必须足够随机。