资讯专栏INFORMATION COLUMN

从http验证流程解析CAS单点登录

honhon / 1050人阅读

JAVA单点登录有好多种方式,譬如用cookie的domain做,用中间代理做等等,但都需要自行做许多开发工作。而其中耶鲁大学的开源项目CAS提供了一个一站式解决方案,只需很少的扩展即可轻松实现企业级单点登录。基础知识网上其他挺多的,这里我就不详述了。本文通过分析http请求过程中http
header,cookie等数据剖析了cas(非代理模式,默认验证逻辑。其他如restletAPI等可扩展逻辑本文不会覆盖)的验证流程,在开发调试中提供了另一种方便的方式掌控整个流程的关键点。

Cas术语

TGT:  cas服务端生成的每个用户唯一的ticket。

TGC:  cas服务端根据TGT生成的每个用户的cookie,其value是TGT。

ST:    cas服务端根据每个应用,每个用户生成的一个ticket,验证一次就销毁。

Shiro: JAVA权限管理框架

Cas请求交互总图

下面将通过两个客户端应用A、B分别跟cas server端交互来详述整个交互流程。本文基于CAS 4.x。 CAS 5.X默认逻辑一致,只不过通过spring boot进行了重新模块划分。

客户端应用A访问跳转Cas Server验证
http request:

GET  http://uc.54315.com/myWhListManager



http response:

302 Found

Location: https://passport.jzt.com/login?service=http://uc.54315.com/casuc

Cas client拦截请求发现session中无cas assertion(其实就是用户名和ticket)并且没有ST则跳转CAS server(本项目由于用了shiro重写拦截逻辑所以是判断shiro中有没有保存验证后的用户信息), server端发现无TGC跳转配置的CAS登陆URL

Cas server端登陆后http请求过程

1. post提交用户信息验证:

    http request:
    
    Post https://passport.jzt.com/login?service=http://uc.54315.com/casuc
    
    
    
    http response:
    
    302 Found
    
    Location:http://uc.54315.com/casuc?ticket=ST-1-0kdGxVoshSZz2Bp6kMaA-

cas01.example.org

Response返回302指示重定向。同时可见response返回两个cookie: CASPRIVACY=和CASTGC=TGT-1-MRebCegmlpucavmxcPqCUMVc496IiJgl06BGyJ736D7c4UPkCw-cas01.example.org

也就是说:cas server端验证通过后产生ST并在location URL后面赋给ticket。此时往客户端浏览器写入TGC,并且指示浏览器重定向到location位置,其正是客户端应用验证ST的路径。

此步骤产生2个ticket: TGT,ST;产生一个cookie:TGC,此cookie是通过用户私密信息与TGT加密生成。

2. Cas client验证ST:

http request:

Get  http://uc.54315.com/casuc?ticket=ST-1-0kdGxVoshSZz2Bp6kMaA-cas01.example.org

此时客户端应用由于受到shiro的保护,request cookie中就不是JSESSIONID而是shiro的SessionId:sid,uuid模式,其与第一步中的sid一致。

http response:

302Found

Location:http://uc.54315.com/myWhListManager;jsessionid=qqwn1wmrsymy47n8udvf7v2s

Response返回302指示重定向到另一个页面(第一次访问的页面或者shiro配置的successful url),同时可见生成了新的session和sessionID。同时可见response返回2个cookie:  JSESSIONID,为servlet容器产生的session id,其为location中的jsessionid;rememberMe,为shiro为自动登录配置的。

此步骤验证ST后(通过url connection去cas server验证ST)如果通过则重定向到新页面(第一次访问的页面或者shiro配置的successful url)产生一个新的容器session id。(为何要重新创建session,因为其会在新的session中保存登陆了客户端应用的凭证CAS Assertion,其为客户端验证ST后返回的)到了这步骤以后属于客户端自身的逻辑。CAS作用到此为止。

3. 客户端应用页面

客户端应用A再次访问
http request:

Get  http://uc.54315.com/getUcUserRegister

http response:

200 OK

可以看到这次直接就访问了,也没有经过验证ticket和与cas服务端交互。此是因为session中已经保存了cas assertion,所以算作登陆了。

客户端应用B访问

1. 访问B应用首页

http request:

Get  http://localhost:8080/

http response:

302 Found

Location: https://passport.jzt.com/login?service=http://localhost:8080/casuc

可见产生了新的shiro session,并提示跳转CAS服务端登陆URL。

2. 访问CAS服务器登陆URL

http request:

Get  https://passport.jzt.com/login?service=http://localhost:8080/casuc

http response:

302 Found

Location: http://localhost:8080/casuc?ticket=ST-2-wtWpPg2Sv4d00fXecLSI-cas01.example.org

可见并没有要求登陆而是直接就提示跳转到location的URL做验证并产生了一个新的ST。这是因为CAS服务端读取了A应用登陆后在浏览器生成的TGC, request cookie中带入了(下图可以看到),从而认为用户已经登陆,所以直接生成ST,并要求重定向到客户端应用B去验证。

3. 验证ST

http request:

Get  http://localhost:8080/casuc?ticket=ST-2-wtWpPg2Sv4d00fXecLSI-cas01.example.org



http response:

302 Found

Location: http://localhost:8080/;jsessionid=1jh99lja6wzxw1jweg8ss40yt8

步骤同A应用。

4. 访问B应用首页

如图

客户端应用A退出

如下图:

可见登出时发生四次请求。

1. 第一次请求:

http request:

GET  https://passport.jzt.com/logout?service=http://uc.54315.com:80/logout



http response:

302 Found

Location: http://uc.54315.com:80/logout

直接访问CAS server端的登出url。Cookie中有CASTGC和server端的JSESSIONID。

返回中CASTGC清空,CASPRIVACY清空。 此时说明server端已经清除了A应用的ST和浏览器的CASTGC

2. 第二次请求:

http request:

Get  http://uc.54315.com/logout



http response:

302 Found

Location: http://uc.54315.com/

跳转到了客户端应用,发现新创建了shiro session(sid)和servlet容器session(JSESSIONID)

并且发现rememberMe和SID的cookie都被换成deleteMe啦。 此为shiro的loginout拦截器干的好事。

3. 第三次请求:

http request:

Get http://uc.54315.com/



http response:

302 Found

Location: https://passport.jzt.com/login?service=http://uc.54315.com/casuc

正常访问首页,但是因为没登陆所以提示要重定向到CAS服务端去登陆。(如果有了首页就改为跳转到首页)

4. 第四次请求

同原来步骤。

Cas总结

总的来说,cas(非代理模式,默认验证逻辑)是用一个cookie(TGC), N个session(N个子系统session,其中存储了cas receipt)来保证各应用的统一登录。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67359.html

相关文章

  • 号外:友户通支持企业自有用户中心啦

    摘要:针对这种情况,友户通特定开发了联邦用户中心来支持企业的自有用户中心。友户通支持通过协议使用企业内部的支持协议的用户中心账号进行登录。友户通目前支持标准协议以及友户通自定义协议可供企业集成。 友户通做用友云的用户系统也一年多了,经常听实施、售前等说要私有化部署友户通,原因无非是企业的考虑到用户安全性和单一用户账号的需求。但由于用户管理的复杂性,友户通部署与维护并不容易,因此经常纠结在用户...

    妤锋シ 评论0 收藏0
  • cas工作原理浅析与总结

    摘要:是大学发起的一个企业级的开源的项目,旨在为应用系统提供一种可靠的单点登录解决方法属于。实现原理是先通过的认证,然后向申请一个针对于的,之后在访问时把申请到的针对于的以参数传递过去。后面的流程与上述流程步骤及以后步骤类似 CAS( Central Authentication Service )是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登...

    warkiz 评论0 收藏0
  • CAS 5.2.x 单点登录 - 实现原理及源码浅析

    摘要:上一篇文章简单介绍了在本地开发环境中搭建服务端和客户端,对单点登录过程有了一个直观的认识之后,本篇将探讨单点登录的实现原理。因此引入服务端作为用户信息鉴别和传递中介,达到单点登录的效果。为该流程的实现类。表示对返回结果的处理。 上一篇文章简单介绍了 CAS 5.2.2 在本地开发环境中搭建服务端和客户端,对单点登录过程有了一个直观的认识之后,本篇将探讨 CAS 单点登录的实现原理。 一...

    elisa.yang 评论0 收藏0
  • 什么是单点登录(SSO)

    摘要:此时,用户想要访问系统受限的资源比如说订单功能,订单功能需要登录后才能访问,系统发现用户并没有登录,于是重定向到认证中心,并将自己的地址作为参数。 前言 只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在我实习之前我就已经在看单点登录的是什么了,但是实习的时候一直在忙其他的事,所以有几个网站就...

    levy9527 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<