单点登录(SSO)实现原理剖析解读
-
什么是单点登录
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了登录产生的时间消耗,辅助了用户管理,是比较流行的。
单点登录(SingleSign-On,SSO)是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议,该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时,用户只需要登录一次,就可以访问多个系统,不需要记忆多个口令密码。单点登录使用户可以快速访问网络,从而提高工作效率,同时也能帮助提高系统的安全性。我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的 session 是无法解决的,我们需要使用相关的单点登录技术来解决。
-
术语
CAS:是Yale大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。CAS具有以下特点:
【1】开源的企业级单点登录解决方案。
【2】CAS Server为需要独立部署的 Web 应用。这个CAS框架已经提供
【3】CAS Client支持非常多的客户端(这里指单点登录系统中的各个Web应用),包括Java, .Net, PHP, Perl, Apache, uPortal, Ruby等。
从结构上看,CAS包含两个部分: CAS Server和CAS Client。CAS Server需要独立部署,主要负责对用户的认证工作;CAS Client负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server。下图是CAS最基本的协议过程:

TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他能够签发ST)。拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他能够找到TGT。
ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就生效了。ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
-
实现机制

1、假设用户访问应用子系统1。判断认证凭证ticket是否存在,不存在,则重定向(302)到认证系统去进行认证操作,重定向到认证系统,跳转到登录界面。
2、用户输入用户名密码,请求发送到认证系统,验证通过后,认证系统将用户登录的信息记录到服务器的session中,并给浏览器返回一个凭证ticket。
3、浏览器将ticket交给应用子系统1,应用子系统1则拿着浏览器交给他的ticket去认证系统是否有效。若有效则放行,并将用户信息保存到应用系统1的session中一份。
4、用户通过认证,浏览器与应用子系统1就可以进行正常的访问了。
5、同样方式当用户再去访问其他应用系统时,浏览器会带着凭证ticket过去,其他应用系统到认证系统验证凭证,凭证ticket若是有效则放行,将用户信息保存到其他应用系统的session中一份。
6、用户通过认证,浏览器与其他应用子系统之间就可以进行正常的访问了。
-
登录流程实例解析
登录需要经历以下三个阶段,如图1-3:



用户第一次访问一个CAS 服务的客户web 应用时(例如访问:
http://shopping.xiaogui.com:8888),部署在客户web 应用的cas AuthenticationFilter ,会拦截此请求,生成service 参数,然后重定向到单点登录服务的login 接口:http://cas.xiaogui.com/cas/login?service=http%3A%2F%2Fshopping.xiaogui.com%3A8888%2F,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会追加在url 后面,然后重定向到web应用:http://shopping.xiaogui.com:8888?ticket=ST-1721-BlR9clBbZxILtEYP-Nv0aqWxmWEkcslj-01,这时将ticket 、service 都传到单点登录认证接口:***/p3/serviceValidate,认证成功后就会把用户信息写入web 应用的session里。
至此,SSO会话就建立起来了,访问另外一个子应用系统,CAS 会读取到浏览器传来的cookie,CAS 不会要求用户去登录页面登录,只是会根据cookie中的TGC在CAS上找到对应的TGT ,TGT签发凭证ticket,然后再和web 应用来做一个验证ticket 的交互,验证成功后会把用户信息写入当前web 应用的session里。
补充:
将浏览器Request Cookies中的TGC一栏的HttpOnly 改为false,修改以下配置文件:


浙公网安备 33010602011771号