CAS原理技术

CAS原理技术

  • 背景
  • 介绍
  • 结构体系
  • 术语
  • 接口
  • 原理
    • 基础模式
      • 1. 首次访问集成CAS Client的应用
      • 2. 再次访问集成CAS Client的同一应用
      • 3. 访问集成CAS Client的其他应用
    • 代理模式
      • 1. 用户在代理服务器上执行身份认证
      • 2. 通过代理应用访问其他应用上授权性资源

背景

本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。

介绍

CAS,Central Authentication Service,统一认证服务,是耶鲁大学发起的一个企业级开源项目,旨在为Web应用系统提供一种可靠的单点登录解决方案。

SSO,Single Sign On,单点登录,指在多个应用系统中,用户只需登录一次就可以访问所有相互信任的应用系统。

CAS和SSO的关系:SSO是一种思想理念,CAS是SSO的一个具体实现。

结构体系

CAS包含两部分:

  • CAS Server
    负责完成对用户的认证工作,需要独立部署,CAS Server处理用户凭证(Credentials),如用户名/密码。
  • CAS Client
    负责处理对受保护资源的访问请求,通常与受保护资源所在应用部署在一起,以 Filter 形式保护被限制访问的资源。

术语

  • KDC:Key Distribution Center
    密钥发放中心。
  • AS:Authentication Service
    认证服务,根据凭证(Credentials)签发TGT(Ticket Granting Ticket)。
  • ST:Service Ticket
    服务票据,服务的唯一标识码,由CAS Server签发(HTTP传输),一个特定服务只能有一个唯一的ST。
  • TGS:Ticket Granting Service
    票据授权服务,根据TGT(Ticket Granting Ticket)签发ST(Service Ticket)。
  • TGT:Ticket Granting Ticket
    由KDC的AS签发的登录票据,拥有过TGT证明该用户已在CAS上成功登录。TGT封装了Cookie值以及此Cookie值对应的用户信息。获取了TGT后,以后申请服务票据(ST,Service Ticket)时便不再需要向KDC提交身份认证信息(Credentials)。
  • TGC:Ticket Granting Cookie
    存放身份认证凭证的Cookie,在浏览器和CAS Server间通信时使用,只能基于安全通道传输(HTTPS),是CAS Server用来明确用户身份的凭证。
  • PT:Proxy Ticket
    应用程序代理用户身份对目标程序进行访问的凭证。
  • PGT:Proxy Granting Ticket
    由CAS Server签发给拥有ST凭证的服务,PGT绑定一个用户的特定服务,使其拥有向CAS Server申请获得PT的能力。
  • PGTIOU:Proxy Granting Ticket I Owe You
    将通过凭证校验时的应答信息由CAS Server返回给CAS Client,同时,与该PGTIOU对应的PGT将通过回调链接传给Web应用,Web应用负责维护PGTIOU与PGT之间映射关系的内容表。

接口

  • /login:登录接口
  • /logout:登出接口
  • /validate:验证用户是否登录中心服务器
  • /serviceValidate:提供给每个业务服务,用于验证用户是否已登录中心服务器

原理

基础模式

1. 首次访问集成CAS Client的应用

CAS基础模式1

  1. 用户访问应用A(https://a.com/);
  2. 浏览器发送GET请求(GET https://a.com/)到应用A服务器;
  3. 应用A服务器收到请求后,在请求 Cookie 中并未找到 session,将请求重定向到CAS服务器的登录接口(302 Location http://cas.com/cas/login?service=https%3A%2F%2Fa.com%2F),重定向URL中携带 service 请求参数,值为 编码后的用户访问的应用A地址(https://a.com/
  4. 浏览器收到来自应用A服务器的重定向响应后,发送请求到CAS服务器的登录接口(GET http://cas.com/cas/login?service=https%3A%2F%2Fa.com%2F);
  5. CAS服务器接收到请求后,在请求 Cookie 中并未找到带有 CASTGC,说明发起请求的客户端身份尚未认证,返回统一登录表单页;
  6. 用户在CAS返回的统一登录表单页上填写用于身份认证的凭证(通常是用户名/密码),然后向CAS服务器发起身份认证请求(POST https://cas.com/cas/login?service=https%3A%2F%2Fa.com%2F);
  7. CAS认证身份成功,生成一个TGT(Ticket Granting Ticket)并写入响应的Cookie(Set-Cookie: CASTGC=TGT-2345678),同时根据URL中的 service 请求参数(service=https%3A%2F%2Fa.com%2F)为应用A生成一个ST(Service Ticket),将请求重定向到用户访问的应用A地址,并添加请求参数 ticketSet-Cookie: CASTGC=TGT-2345678 302 Location: https://a.com/?ticket=ST-12345678);
  8. 浏览器收到来自CAS服务器的重定向响应后,发送请求到应用A服务器(GET https://a.com?ticket=ST-12345678);
  9. 应用A服务器收到浏览器请求后,取出 ticket 请求参数,向CAS服务器发起认证 ticket 合法性的请求(GET https://cas.com/serviceValidate?service=https%3A%2F%2Fa.com%2F&ticket=ST-12345678);
  10. CAS服务器验证 ticket 合法后返回 200 [XML Content],其中包含验证成功结果、认证对象及一些可选属性;
  11. 应用A服务器得到 ticket 合法的认证结果后,生成一个 session 写入响应的 Cookie(图中的 JSESSIONID 是Tomcat生成的),并返回浏览器一个重定向地址,此地址指向用户最初发起访问请求的地址(Cookie: JSESSIONID=ABC1234567 302 Location: https://a.com/);
  12. 浏览器接收到重定向响应后再次向应用A发起访问请求,请求的 Cookie 中携带应用A返回的 JSESSIONIDCookie: JSESSIONID=ABC1234567 GET https://a.com/);
  13. 应用A服务器验证浏览器请求Cookie中 JSESSIONID 合法后返回实际资源。

2. 再次访问集成CAS Client的同一应用

CAS基础模式2

  1. 用户使用同一浏览器访问应用A的资源;
  2. 浏览器发送GET请求到应用A服务器(GET http://a.com/resource),注意,因为在上一步中应用A已经给浏览器写入了带有 JSESSIONID 的Cookie,因此此时发送的GET请求的Cookie中也有这部分信息(Cookie: JSESSIONID=ABC1234567);
  3. 应用A接收到资源访问请求后,验证请求Cookie中 session 是否合法,如果合法则返回用户请求的资源信息。

3. 访问集成CAS Client的其他应用

CAS基础模式3

  1. 用户使用同一浏览器访问应用B,应用B和应用A共用一套CAS;
  2. 浏览器发送GET请求(GET https://b.com/)到应用B服务器;
  3. 应用B服务器收到请求后,在请求 Cookie 中并未找到 session,将请求重定向到CAS服务器的登录接口(302 Location http://cas.com/cas/login?service=https%3A%2F%2Fb.com%2F),重定向URL中携带 service 请求参数,值为 编码后的用户访问的应用B地址(https://b.com/
  4. 浏览器收到来自应用B服务器的重定向响应后,发送请求到CAS服务器的登录接口(Cookie: CASTGC=TGT-2345678 GET http://cas.com/cas/login?service=https%3A%2F%2Fb.com%2F),注意:因为之前访问应用A时CAS已执行身份认证并写入 CASTGC 到 Cookie 中,因此浏览器向CAS服务器发送的后续请求中都会带上此 Cookie
  5. CAS服务器接收到请求后,验证请求 Cookie 中的 CASTGC 合法,根据URL中的 service 请求参数(service=https%3A%2F%2Fb.com%2F)为应用B生成一个ST(Service Ticket),将请求重定向到用户访问的应用B地址,并添加请求参数 ticket302 Location: https://b.com/?ticket=ST-345678);
  6. 浏览器收到来自CAS服务器的重定向响应后,发送请求到应用B服务器(GET https://b.com?ticket=ST-345678);
  7. 应用B服务器收到浏览器请求后,取出 ticket 请求参数,向CAS服务器发起认证 ticket 合法性的请求(GET https://cas.com/serviceValidate?service=https%3A%2F%2Fb.com%2F&ticket=ST-345678);
  8. CAS服务器验证 ticket 合法后返回 200 [XML Content],其中包含验证成功结果、认证对象及一些可选属性;
  9. 应用B服务器得到 ticket 合法的认证结果后,生成一个 session 写入响应的 Cookie(Set-Cookie: MOD_AUTH_CAS_S=XYZ1234567),并返回浏览器一个重定向地址,此地址指向用户最初发起访问请求的地址(302 Location: https://b.com/);
  10. 浏览器接收到重定向响应后再次向应用B发起访问请求,请求的 Cookie 中携带应用B返回的 MOD_AUTH_CAS_SCookie: MOD_AUTH_CAS_S=XYZ1234567 GET https://b.com/);
  11. 应用B服务器验证浏览器请求Cookie中 MOD_AUTH_CAS_S 合法后返回实际资源。

代理模式

应用场景:用户访问应用A,应用A又要访问应用B的授权性资源,应用A想代表用户去访问应用B,因此应用A需要告诉应用B用户是谁,以便应用B对当前用户请求进行授权。

为解决以上问题,CAS引入代理模式。代理模式的前提是CAS Client拥有用户的身份信息凭据(Credentials)。

CAS基础模式中 TGT(Ticket Granting Ticket) 是用户(浏览器)持有的身份信息凭据,CAS代理模式中引入 PGT(Proxy Granting Ticket),是CAS Client持有的身份信息凭据。凭借 TGT 用户可以免登录访问其他服务,同理,凭借 PGT CAS Client可以免用户登录访问其他服务。

1. 用户在代理服务器上执行身份认证

CAS代理模式1

  1. 用户访问应用A;
  2. 浏览器发送GET请求(GET https://proxy.com/)到应用A服务器;
  3. 应用A服务器收到请求后,在请求 Cookie 中并未找到 session,将请求重定向到CAS服务器的登录接口(302 Location http://cas.com/cas/login?service=https%3A%2F%2Fproxy.com%2F),重定向URL中携带 service 请求参数,值为 编码后的用户访问的应用A地址(https://proxy.com/
  4. 浏览器收到来自应用A服务器的重定向响应后,发送请求到CAS服务器的登录接口(GET http://cas.com/cas/login?service=https%3A%2F%2Fproxy.com%2F);
  5. CAS服务器接收到请求后,在请求 Cookie 中并未找到带有 CASTGC,说明发起请求的客户端身份尚未认证,返回统一登录表单页;
  6. 用户在CAS返回的统一登录表单页上填写用于身份认证的凭证(通常是用户名/密码),然后向CAS服务器发起身份认证请求(POST https://cas.com/cas/login?service=https%3A%2F%2Fproxy.com%2F);
  7. CAS认证身份成功,生成一个TGT(Ticket Granting Ticket)并写入响应的Cookie(Set-Cookie: CASTGC=TGT-2345678),同时根据URL中的 service 请求参数(service=https%3A%2F%2Fproxy.com%2F)为应用A生成一个ST(Service Ticket),将请求重定向到用户访问的应用A地址,并添加请求参数 ticketSet-Cookie: CASTGC=TGT-2345678 302 Location: https://proxy.com/?ticket=ST-12345678);
  8. 浏览器收到来自CAS服务器的重定向响应后,发送请求到应用A服务器(GET https://proxy.com?ticket=ST-12345678);
  9. 应用A服务器收到浏览器请求后,取出 ticket 请求参数,向CAS服务器发起认证 ticket 合法性的请求(GET https://cas.com/serviceValidate?service=https%3A%2F%2Fproxy.com%2F&ticket=ST-12345678&pgtUrl=https%3A%2F%2Fproxy.com%2FpgtCallbackURL),注意请求参数pgtUrl
  10. CAS服务器收到请求后发现请求参数 pgtUrl,生成 pgtIdpgtIou 后调用 pgtUrl 指向的回调地址(GET https://proxy.com/pgtCallbackURL?pgtId=TGT-23456789&pgtIou=PGTIOU-12345678);
  11. 应用A服务器存储 PGTIOUPGT 之间的映射关系;
  12. 应用A服务器生成一个 session 写入响应的 Cookie(图中的 JSESSIONID 是Tomcat生成的),并返回浏览器一个重定向地址,此地址指向用户最初发起访问请求的地址(Cookie: JSESSIONID=ABC1234567 302 Location: https://proxy.com/);
  13. 浏览器接收到重定向响应后再次向应用A发起访问请求,请求的 Cookie 中携带应用A返回的 JSESSIONIDCookie: JSESSIONID=ABC1234567 GET https://proxy.com/);
  14. 应用A服务器验证浏览器请求Cookie中 JSESSIONID 合法后返回实际资源。

2. 通过代理应用访问其他应用上授权性资源

CAS代理模式2

  1. 用户通过应用A访问应用B上资源;
  2. 浏览器发送GET请求(GET https://app.com/resource)到应用A服务器,因此上一步中应用A已向 Cookie 中写入 session,所以此请求的 Cookie 中也带有此 sessionCookie: JSESSIONID=ABC1234567);
  3. 应用A服务器收到请求后,发现需要获取应用B上资源,因此向CAS服务器发起一个代理请求,要求为应用B生成一个ST(Service Ticket),请求URL:GET https://cas.com/proxy?pgt=TGT-23456789&targetService=https:%3A%2F%2Fapp.com%2F,URL中 pgt 参数值为上一步中生成 pgtId
  4. CAS服务器收到请求后生成一个ST(ST-2345678)返回;
  5. 应用A收到CAS服务器返回的ST后,向应用B发起一个GET请求(GET https://app.com/?ticket=ST-2345678);
  6. 应用B服务器收到浏览器请求后,取出 ticket 请求参数,向CAS服务器发起认证 ticket 合法性的请求(GET https://cas.com/serviceValidate?service=https%3A%2F%2Fapp.com%2F&ticket=ST-2345678);
  7. CAS服务器验证 ticket 合法后返回 200 [XML Content],其中包含验证成功结果、认证对象及一些可选属性;
  8. 应用B服务器得到 ticket 合法的认证结果后,生成一个 session 写入响应的 Cookie,并返回一个重定向地址给应用A(Set-Cookie: MOD_AUTH_CAS_S=XYZ1234567 302 Location: https://app.com/);
  9. 应用A服务器接收到重定向响应后再次向应用B发起访问请求,请求的 Cookie 中携带应用B返回的 MOD_AUTH_CAS_SCookie: MOD_AUTH_CAS_S=XYZ1234567 GET https://app.com/);
  10. 应用B服务器验证请求Cookie中 MOD_AUTH_CAS_S 合法后,将被访问资源返回给应用A服务器;
  11. 应用A服务器收到应用B服务器的响应后,对响应进行处理后返回给浏览器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/654347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速版-JS基础01书写位置

1.书写位置 2.标识符 3.变量 var:声明变量。 (1).变量的重新赋值 (2).变量的提升 打印结果:console.log(变量名) 第一个是你写在里面的。 第二个是实际运行的先后之分,变量名字在最前面。变量…

牛客NC392 参加会议的最大数目【中等 贪心+小顶堆 Java/Go/PHP 力扣1353】

题目 题目链接: https://www.nowcoder.com/practice/4d3151698e33454f98bce1284e553651 https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/description/ 思路 贪心优先级队列Java代码 import java.util.*;public class Solution {/**…

《MySQL怎样运行的》—InnoDB数据页结构

在上一篇文章中我们讲了,InnoDB的数据页是InnoDB管理存储空间的基本单位,一个页的大小基本为16kb 那你有没有疑问,就是说这个InnoDB的数据页的结构是什么样的,还有他这些结构分别有那些功能~接下来我们一一讲解 数据页的总览结构…

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型,有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢?今天我们就来聊聊这个问题。 目前来看,主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

java中的Collections类+可变参数

一、概述 Collections类是集合类的工具类,与数组的工具类Arrays类似 二、可变参数(变:数量) 格式:参数类型名...参数,可变参数就是一个数组 注意:可变参数必须放在参数列表的最后并且一个参数列表只能有一个可变参…

Golang | Leetcode Golang题解之第101题对称二叉树

题目: 题解: func isSymmetric(root *TreeNode) bool {u, v : root, rootq : []*TreeNode{}q append(q, u)q append(q, v)for len(q) > 0 {u, v q[0], q[1]q q[2:]if u nil && v nil {continue}if u nil || v nil {return false}if …

conda 环境找不到 libnsl.so.1

安装prokka后运行报错 perl: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory 通过conda list 可以看到 有libsnl 2.00版本,通过修改软链接方式进行欺骗

Vue3项目练习详细步骤(第一部分:项目构建,登录注册页面)

项目环境准备 工程创建 安装依赖 项目调整 注册功能 页面结构 接口文档 数据绑定和校验 数据接口调用 解决跨域问题 登录功能 接口文档 数据绑定和校验 数据接口调用 优化登录/注册成功提示框 项目演示 项目的后端接口参考:https://blog.csdn.net/daf…

selenium 学习笔记(一)

pip的安装 新建一个txt curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 把上面的代码复制进去后,把后缀名改为.bat然后双击运行 当前目录会出现一个这个文件 然后在命令行pyhon get-pip.py等它下好就可以了selenium安装 需要安装到工程目…

第15章-超声波避障功能 HC-SR04超声波测距模块详解STM32超声波测距

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 15.1-超声波测距 完成超声波测距功能、测量数据显示在OLED屏幕上 硬件介绍 使用&#…

react 保持组件纯粹

部分 JavaScript 函数是 纯粹 的,这类函数通常被称为纯函数。纯函数仅执行计算操作,不做其他操作。你可以通过将组件按纯函数严格编写,以避免一些随着代码库的增长而出现的、令人困扰的 bug 以及不可预测的行为。但为了获得这些好处&#xff…

【问题解决】huggingface 离线模型下载

问题 因业务需要在本机测试embedding分词模型,使用 huggingface上的transformers 加载模型时,因为网络无法访问,不能从 huggingface 平台下载模型并加载出现如下错误。 下面提供几种模型下载办法 解决 有三种方式下载模型,一种是通…

《书生·浦语大模型实战营》第1课 学习笔记:书生·浦语大模型全链路开源体系

文章大纲 1. 简介与背景智能聊天机器人与大语言模型目前的开源智能聊天机器人与云上运行模式 2. InternLM2 大模型 简介3. 视频笔记:书生浦语大模型全链路开源体系内容要点从模型到应用典型流程全链路开源体系 4. 论文笔记:InternLM2 Technical Report简介软硬件基础…

苹果手机数据不慎删除?这4个方法果粉必看!

苹果手机该怎么恢复丢失的数据呢?有时候会因为使用不当或者是被他人误删等原因,导致重要的数据丢失,这时我们需要找回丢失手机数据,小编给大家分享4种恢复苹果手机数据的技巧,大家赶紧来学一学吧! 一、iclo…

618有哪些值得买的好物?这几款好物通宵整理吐血推荐!

随着618购物节越来越近,很多买家终于等到了用好价钱买好东西的好机会。不管是你一直想要的家居电器,还是最新的数码产品,平时挺贵的东西在618期间会便宜不少。不过,这么多东西可选,促销活动也多得让人看花了眼&#xf…

SAM遥感图像处理开源新SOTA!在GPU上实现40倍加速,不损准确性

在遥感图像处理领域,通过SAM捕捉复杂图像特征和细微差异,可以实现高精度的图像分割,提升遥感数据的处理效率。这种高度的准确性让SAM遥感展现出了比传统方法更优越的性能。 不仅如此,这种策略灵活普适的特性还能拓展遥感技术的应…

Python | Leetcode Python题解之第102题二叉树的层序遍历

题目: 题解: class Solution:def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []res, queue [], collections.deque()queue.append(root)while queue:tmp []for _ in range(len(queue)):node queue.popl…

Unity3D让BoxCollider根据子物体生成自适应大小

系列文章目录 unity工具 文章目录 系列文章目录unity工具 👉前言👉一、编辑器添加👉二、代码动态添加的方法(第一种)👉三、代码动态添加的方法(第二种)👉四、重新设置模型的中心点👉壁纸分享👉…

分布式事务解决方案(最终一致性【可靠消息解决方案】)

可靠消息最终一致性解决方案 可靠消息最终一致性分布式事务解决方案指的是事务的发起方执行完本地事务之后,发出一条消息,事务的参与方,也就是消息的消费者一定能够接收到这条消息并且处理完成,这个方案强调的是只要事务发起方将消…

03 FreeRTOS 同步互斥与通信

1、同步与互斥 一句话理解同步与互斥:我等你用完厕所,我再用厕所。 什么叫同步?就是:哎哎哎,我正在用厕所,你等会。 什么叫互斥?就是:哎哎哎,我正在用厕所,你…