网络基础 CAS协议学习总结
架构介绍

系统组件
CAS服务器和客户端构成了CAS系统体系结构的两个物理组件,它们通过各种协议进行通信。
CAS服务器
CAS服务器是基于Spring Framework构建的Java servlet,其主要职责是通过签发和验证ticket来验证用户并授予对启用CAS认证了的服务(通常称为CAS客户端)的访问权限。当用户成功登录(即认证通过)时,CAS服务器会向用户签发TGT(Ticket Granting Ticket),并创建SSO会话。应用户的请求,通过使用TGT作为令牌的浏览器重定向,向启用CAS认证的服务签发ST(Service Ticket)。ST随后通过调用接口在CAS服务器上进行验证。这些交互作用在CAS协议文档中有详细描述。
CAS客户端
术语“CAS客户端”在其常见用法中有两个不同的含义。CAS客户端是任何启用CAS认证的应用,可通过支持的协议与CAS服务器通信。CAS客户端也是一个软件包,可以与各种软件平台和应用程序集成,以便通过某些身份验证协议(例如CAS、SAML、OAuth)与CAS服务器通信。CAS客户端支持多种软件平台和并且已经开发了很多产品。
CAS协议
CAS协议是一种简单而强大的基于票证(ticket)的协议。完整的协议规范可以查看这里。
它涉及一个或多个客户端和一个服务器。客户端嵌入在CAS化的(CASified)应用程序中(称为“CAS服务”),而CAS服务器则是一个独立的组件:
关键概念:
TGT(Ticket Granting Ticket), 存储在TGCcookie中,为SSO(Single Sign On, 单点登录,)会话的Key,代表某个用户的某个SSO会话。TGC(Ticket Granted Cookie),以TGT为值的CookieST(Service Ticket,服务票证), 作为GETURL请求参数传输,表示由CAS服务器授予给特定用户对CAS服务的访问权限。
单点登录:指在多个应用系统中,只需登录一次,即可在多个应用系统之间共享登录。
协议版本
3.0.3
当前的CAS协议版本是“3.0.3”。协议规范说明可参考连接 https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol-Specification.html,由Apereo CAS服务实现,作为官方参考实现。在CAS协议“2.0”之上增加了最常见的增强功能。在其他功能中,版本“2.0”和“3.0”之间最引人注目的更新是能够通过新的/p3/serviceValidate端点返回身份验证/用户属性。
2.0
协议规范说明,可参考连接 https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol-V2-Specification.html
Web流程图

过程详述
用户通过浏览器访问被保护的应用(暂且称之为 应用服务)
GET https://app.example.com/
应用服务上的CAS客户端检测到用户需要进行身份认证时,携应用返回302响应状态码,指示浏览器重定向到CAS服务器。
说明:CAS客户端包含一个
AuthenticationFilter过滤器,该过滤器可以拦截所有的请求,用于判断用户是否需要通过Cas Server进行身份认证,如果需要则将跳转到CAS服务器登录页面,否则则请求会继续往下执行关键响应头
location: https://cas.example.com/cas/login?service=https%3A%2F%2Fapp.example.com%2F
其中,
service指向用户原访问地址(注意,是经过URL编码后的地址)浏览器根据302响应状态码及响应头
location指示,自动重定向访问CAS服务器。GET https://cas.example.com/cas/login?service=https%3A%2F%2Fapp.example.com%2F
CAS服务器未检测到SSO会话,向用户返回CAS登录表单页面。
用户手动输入正确用户名,密码等认证信息后,提交表单
POST https://cas.example.com/cas/login?service=https%3A%2F%2Fapp.example.com%2F
CAS服务器接收到用户名和密码后,对用户进行验证(可使用CAS服务器默认的验证,也可以自定义实现验证方法),如果验证通过,则创建SSO会话,签发一个
ST(作为location请求中URL参数传输) , 返回302响应状态码,及location请求头,提示浏览器重定向访问应用服务。关键响应头
Location: https://app.example.com/?ticket=ST-12345678
Set-Cookie: CASTGC=TGT-2345678
说明:
Set-Cookie响应头,提示浏览器存储Cookie--将TGT(Ticket Granted Ticket)存储为CASTGCCookie值,这是单点登录的关键步骤,因为这样以后,当前浏览器中访问其它需要CAS认证的应用服务时,将自动携带CASTGCCookie重定向访问CAS服务器网站,而访问CAS服务器时,CAS服务会通过该Cookie值,即TGT来查找对应的SSO会话,如果存在会话,则表示已登录CAS服务器,签发ST, 返回302响应状态码,提示浏览器重定向访问应用服务,否则未登录,返回CAS服务器登录页。注意,
CASTGC也可能被命名为其它类似名称,比如CASTGC-D,如果有对CAS服务器进行相关改造的话。浏览器根据302响应状态码及响应头
location指示,自动重定向访问 应用服务。GET https://app.example.com/?ticket=ST-12345678
应用服务收到请求后,请求CAS服务器服务验证接口,验证
ST注意:每个
ST只能用一次,且存在有效期,这就是为啥需要二次访问CAS服务器进行验证的原因。GET https://cas.example.com/serviceValidate?service=https%3A%2F%2Fapp.example.com%2F&ticket=ST-12345678
CAS服务器对
ST进行验证,生成XML响应报文,返回给应用服务,该XML响应报文包含是包含是否验证成功、被认证的用户信息、可选属性。应用服务收到响应报文后,可根据CAS服务器验证结果,为当前用户生成会话,返回302响应状态码,
Set-Cookie及location响应头,提示浏览器存储会话Cookie,并再次通过重定向访问应用服务。关键响应头:
Set-Cookie: JSESSIONID=ABC1234567
Location: https://app.example.com/
注意:上述
Location中的URL,没有携带ticket参数,避免长时间将ST暴露在浏览器地址栏中用户浏览器收到响应后,根据提示重定向访问应用服务
GET https://app.example.com/
Cookie: JSESSIONID=ABC1234567
应用服务收到上述请求后,验证会话Cookie,如果存在对应会话,则表示用户已登录,返回用户请求的资源
当用户第二次访问相同应用服务时,应用服务会再次验证会话Cookie,如果存在对应会话,则表示用户已登录,返回用户请求的资源
GET https://app.example.com/resource
Cookie: JSESSIONID=ABC1234567
用户通过浏览器访问被保护的另一个应用(暂且称之为 应用服务2)
GET https://app2.example.com/
应用服务2上的CAS客户端检测到用户需要进行身份认证时,携应用返回302响应状态码,指示浏览器重定向到CAS服务器。
关键响应头
location: https://cas.example.com/cas/login?service=https%3A%2F%2Fapp2.example.com%2F
浏览器根据302响应状态码及响应头
location指示,携CASTGCCookie自动重定向访问CAS服务器。GET https://cas.example.com/cas/login?service=https%3A%2F%2Fapp2.example.com%2F
Cookie: CASTGC=TGT-2345678
CAS服务器根据
CASTGC检测是否已存在SSO会话,发现已存在对应会话(即无需CAS登录),签发一个ST, 返回302响应状态码,及location请求头,提示浏览器重定向访问应用服务。关键响应头
Location: https://app2.example.com/?ticket=ST-345678
浏览器根据302响应状态码及响应头
location指示,自动重定向访问 应用服务2。GET https://app2.example.com/?ticket=ST-345678
应用服务2收到请求后,请求CAS服务器服务验证接口,验证
STGET https://cas.example.com/serviceValidate?service=https%3A%2F%2Fapp2.example.com%2F&ticket=ST-345678
CAS服务器对
ST进行验证,生成XML响应报文,返回给应用服务,该XML响应报文包含是包含是否验证成功、被认证的用户信息、可选属性。应用服务2收到响应报文后,可根据CAS服务器验证结果,为当前用户生成会话,返回302响应状态码,
Set-Cookie及location响应头,提示浏览器存储会话Cookie,并再次通过重定向访问应用服务2。关键响应头:
Set-Cookie: MOD_AUTH_CAS_S=XYZ1234567
Location: https://app.example.com/
注意:上述
Location中的URL,没有携带ticket参数,避免长时间将ST暴露在浏览器地址栏中用户浏览器收到响应后,根据提示重定向访问应用服务2
GET https://app2.example.com/
Cookie: MOD_AUTH_CAS_S=XYZ1234567
应用服务2收到上述请求后,验证会话Cookie,如果存在对应会话,则表示用户已登录,返回用户请求的资源
CAS单点登出(SLO,Single Logout )
单点登出(注销登录),意味着除了让CAS服务器自身SSO会话失效,还将使客户端应用会话失效,如果CAS客户端支持注销协议的话。
只要TGT过期,就会启动注销协议。
使用警告!
默认情况下,启用单点登出。
当CAS会话结束时,它会通知每个应用服务SSO会话不再有效,依赖方需要使自己的会话无效。记住,提交给每个CAS保护应用服务的回调仅是一个通知,没有别的了。应用程序需要拦截该通知,并通过特定端点手动或更常见的是通过支持SLO的CAS客户端类库正确销毁用户身份验证会话。
还要注意,由于SLO是一个全局事件,因此默认情况下,将联系具有CAS身份验证记录的所有应用程序,如果这些应用程序彼此不同,则可能会对用户体验造成负面影响。例如,如果用户已登录门户应用程序和电子邮件应用程序,则通过SLO注销其中一个应用程序也会破坏另一个的用户会话,如果应用程序没有仔细管理其会话和用户活动,这可能意味着数据丢失。
流程如下:

通过访问CAS服务器logout API(如下),可以注销CAS登录。
https://cas.example.com/cas/logout

如果希望注销登录后,跳转到应用服务登录页,需要添加service参数,并设置跳转目标URL,如下:
https://wcas.sit.sf-express.com/cas/logout?service=https%3A%2F%2Fcas.example.com%2Fcas%2Flogin%3F
参考连接
https://apereo.github.io/cas/6.6.x/planning/Architecture.html
https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol.html
https://apereo.github.io/cas/6.6.x/protocol/CAS-Protocol-Specification.html
https://cloud.tencent.com/developer/article/2141095
https://apereo.github.io/cas/6.6.x/installation/Logout-Single-Signout.html
网络基础 CAS协议学习总结的更多相关文章
- 软件定义网络基础---NETCONF协议
netconf协议最早被作为网管协议被提出来的,与SNMP网管协议相比较:SNMP的优势在于网络设备的监测,在大规模网管应用中有很大不足,正是针对这种不足之处,提出了NETCONF协议 一:NETCO ...
- 网络基础 HTTP协议之http url简介
HTTP协议之http url简介 by:授客 QQ:1033553122 http url简介 http url通过http协议,用于定位网络资源,是一种特殊类型的URI(统一资源定位) http_ ...
- [计算机基础]HTTP协议学习笔记
HTTP:Hypertext transfer protocol超文本传输协议是一种详细规定了浏览器和Internet之间互相通信的规则 HTTP允许传输任意类型的数据对象,由Content-Type ...
- 网络基础 HTTP协议之缓存简介
HTTP协议之缓存简介 by:授客 QQ:1033553122 用浏览器查看缓存 IE为例,Tools->Internet options -> View files,如图 点击图示的Vi ...
- 网络基础 HTTP协议之HTTP消息(HTTP Message)
HTTP协议之HTTP消息(HTTP Message) by:授客 QQ:1033553122 1. 消息类型(Message Type) HTTP messages包含从客户端到服务器的请求和服 ...
- 软件定义网络基础---OpenFlow协议
一:OpenFlow协议概述 OpenFlow协议为控制器与交换机之间的通信,提供了一种开放标准的方式.OpenFlow交换机通过安全通道与控制器进行信息交互 二:OpenFlow消息类型 (一)co ...
- 软件定义网络基础---OF-Config协议
交换机与控制器继续通信前,是需要对其功能.特性以及资源进行配置才能进行工作,这些配置是如何实现的?是由专门的配置协议指导完成的 一:OF-Config协议 是OpenFlow交换机管理配置协议,是Op ...
- 三分钟网络基础-ARP协议
什么是 ARP 协议 地址解析协议 ARP (Address Resolution Protocal):在同一局域网下,根据已知道的主机或路由器的 IP 地址,找出其相应的硬件地址. 高速缓存 每一个 ...
- TCP/IP协议(一)网络基础知识
参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...
- 转:TCP/IP协议(一)网络基础知识
转载:http://www.cnblogs.com/imyalost/p/6086808.html 参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知 ...
随机推荐
- C#使用WebView2替代Electron
C#想要实现Electron那样混合桌面程序可以用以下几个库.本文使用EdgeSharp NanUIgithub.com/NetDimension/NanUI Photinogithub.com/ ...
- MySQL 导出一条数据的插入语句
1.MySQL 导出一条数据的插入语句的方法 在MySQL中,如果我们想要导出一条数据的插入语句,我们可以使用SELECT ... INTO OUTFILE语句(但这通常用于将整个表或查询结果导出到一 ...
- vue3 Suspense
在Vue.js 3中,Suspense 是一个用于处理异步组件的特殊组件,它允许你在等待异步组件加载时展示备用内容.这对于优化用户体验.处理懒加载组件或异步数据获取时非常有用.Suspense 的主要 ...
- 执行nodejs 内置fs模块
执行方式1: 在 cmd 中 任意文件夹路径下输入 node 回车 C:\Users\32991>node ...
- INFINI Console 与华为鲲鹏完成产品兼容互认证
何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...
- Easysearch 容量规划建议
基于容量估算 主要问题: 每天将索引多少原始数据(GB)?保留数据多少天? 原始数据膨胀率 您将强制执行多少个副本分片? 您将为每个数据节点分配多少内存? 您的内存:数据比例是多少? 原则 保留 +1 ...
- Ubuntu 更改鼠标滚轮速度
1.安装imwheel sudo apt-get install imwheel 2.更改配置 sudo gedit ~/.imwheelrc 输入以下内容: ".*"None, ...
- StringRedisHelper
@Slf4j @Service public class StringRedisHelper { private StringRedisTemplate redisTemplate; @Autowir ...
- 以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的
本文基于 OpenJDK17 进行讨论 1. Reference 相关概念及其应用场景总览 Reference(引用)是 JVM 中非常核心且重要的一个概念,垃圾回收器判断一个对象存活与否都是围绕着这 ...
- reactHooks的组件通信
父组件调用子组件的方法 // 父组件 import React, { useEffect, useRef, useState } from 'react'; import StopModal from ...