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服务器的响应后,对响应进行处理后返回给浏览器。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB CRUD操作:内嵌文档查询

MongoDB内嵌文档的查询 文章目录 MongoDB内嵌文档的查询使用点号.查询内嵌文档嵌套字段的相等匹配使用查询操作符进行匹配指定AND条件 嵌套文档的匹配使用 MongoDB Atlas 查询内嵌文档导航至集合指定查询过滤文档点击应用 可以使用下面几种方法查询MongoDB中的嵌入文档&#xf…

开机必启截图标注类神器Snipaste,基本使用及技巧

目录 一、软件简介二、基本安装三、自启设置四、快捷操作五、使用技巧 一、软件简介 Snipaste 是一款简单高效的截图工具。只需按下 F1 即可截图(可进行自主设置),再按 F3 即可将截图置顶显示(贴图功能)。你还可以将剪…

反射器与联邦实验

要求: 1、AS1存在两个环回, 一个地址为192.168.1.0/24该地址不能在任何协议中宣告AS3存在两个环回, 一个地址为192.168.2.0/24该地址不能在任何协议中宣告 最终要求这两个环回可以互相通讯; AS1的另一个环回为10.1.1.0/24 AS3的另-个环回为10.1.2.0/24 2、整个AS2的…

JMeter 测试单节点与集群的并发异常率

一. JMeter 测试单节点与集群的并发异常率 下载地址:https://jmeter.apache.org/download_jmeter.cgi 单个tomcat测试结果(2000个用户,每个用户访问100次) nginx集群负载均衡tomcat结果(2000个用户,每个用户访问100次)

OpenCV Haar小波变换

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 图像Haar小波变换是一种基于小波分析的信号处理技术,特别适用于图像处理领域。以下是关于图像Haar小波变换过程: 分解:(1)假设原始图像为f(x,y),其中(x,y)表示图像上的像素坐标。 (2)对原始图像进行Haar小…

Kubernetes 硬盘持久化之 NFS 使用

Kubernetes 硬盘持久化之 NFS 使用 NFS 定义和使用 NFS 全称是 Network File System (网络文件系统),即通过网络协议挂载一块远端的逻辑盘。 apiVersion: v1 kind: Pod metadata:name: pod-nfsnamespace: default spec:containers:- name:…

草台班子啊草台班子:共享电源导致的BUG(供电不足)

某日吧(其实就是今日,不过什么时候我又删帖重发也不一定啊),下工厂干活,机器里面没多的插座(其实一个插座都没有,但是有一个24V电源的的设备),于是带队的下令并着接&…

YOLOV8逐步分解(5)_模型训练初始设置之混合精度训练AMP

yolov8逐步分解(1)--默认参数&超参配置文件加载 yolov8逐步分解(2)_DetectionTrainer类初始化过程 yolov8逐步分解(3)_trainer训练之模型加载_yolov8 加载模型-CSDN博客 YOLOV8逐步分解(4)_模型的构建过程 在上述文章逐步分解(3)和(4&…

使用tkMapper时避免传入null值导致查询数据不符合预期

使用tkMapper时避免传入null值导致查询数据不符合预期 在我们日常使用tkmapper时&#xff0c;我们一般的写法是&#xff1a; Weekend<StudentDO> weekend Weekend.of(StudentDO.class); weekend.weekendCriteria().andEqualTo(StudentDO::getClassCode, req.getClassCod…

【吊打面试官系列】Java高并发篇 - ConcurrentHashMap 的并发度是什么?

大家好&#xff0c;我是锋哥。今天分享关于 【ConcurrentHashMap 的并发度是什么?】面试题&#xff0c;希望对大家有帮助&#xff1b; ConcurrentHashMap 的并发度是什么? ConcurrentHashMap 的并发度就是 segment 的大小&#xff0c;默认为 16&#xff0c; 这意味着最多同时…

Android:将时间戳转换为本地时间格式

一、效果图 图1&#xff0c;中国的时间格式 图2&#xff0c;美国的时间格式 二、StringUtil.kt代码 import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* object StringUtil {fun formatTimestamp(currentTime: Long): String {var sdf Si…

【STM32】检测SD卡是否插入

【STM32】检测SD卡是否插入 开发环境原理图确定引脚的高低电平中断方式检测插入配置引脚打开引脚的中断编写代码显示SD卡信息引脚中断回调函数 实现的效果 开发环境 软件&#xff1a;STM32CubeIDE1.14.1 硬件&#xff1a;立创天空星STM32F407VE&#xff1b;SD卡 原理图 要确…

MySQL之创建高性能的索引(三)

创建高性能的索引 哈希索引 哈希索引(hash index)基于哈希表实现&#xff0c;只有精确匹配索引所有的列的查询才有效。对于每一行数据&#xff0c;存储引擎都会对所有的索引列计算一个哈希码(hash code).哈希码是一个较小的值&#xff0c;并且不同键值的行计算出来的哈希码也…

波兰表达式c语言递归

波兰表达式&#xff08;Polish Notation&#xff09;&#xff0c;又称前缀表达式&#xff0c;是一种没有括号的算术表达式&#xff0c;其中运算符位于操作数之前。与常见的中缀表达式&#xff08;如常见的数学表达式&#xff09;不同&#xff0c;波兰表达式避免了对括号的需求&…

isscc2024 short course4 In-memory Computing Architectures

新兴的ML加速器方法&#xff1a;内存计算架构 1. 概述 内存计算&#xff08;In-memory Computing&#xff09;架构是一种新兴的机器学习加速器方法&#xff0c;通过将计算能力集成到存储器中&#xff0c;以减少数据移动的延迟和能耗&#xff0c;从而提高计算效率和性能。这种方…

linux mv操作和cp操作

mv 和 cp 是 Linux 系统中用于移动和复制文件或文件夹的两个常用命令&#xff0c;它们之间的主要区别在于&#xff1a; mv&#xff08;move&#xff09;&#xff1a;mv 命令用于移动文件或文件夹&#xff0c;将它们从一个位置移动到另一个位置。移动后&#xff0c;原始文件或文…

服务器软件架构演进

服务器软件架构演进 背景介绍阶段一&#xff1a;单机部署阶段二&#xff1a;应用与数据分离部署阶段三&#xff1a;启用缓存优化阶段四&#xff1a;启用应用服务器集群阶段五&#xff1a;数据库读写分离阶段六&#xff1a;启用反向代理及CDN加速阶段七&#xff1a;启用分布式文…

ComfyUI简单介绍

&#x1f353;什么是ComfyUI ComfyUI是一个为Stable Diffusion专门设计的基于节点的图形用户界面&#xff0c;可以通过各种不同的节点快速搭建自己的绘图工作流程。 软件打开之后是长这个样子&#xff1a; 同时软件本身是github上的一个开源项目&#xff0c;开源地址为&#…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第28课-avatar玩家3D形象

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第28课-avatar玩家3D形象 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…

零售EDI:Target DVS EDI项目案例

Target塔吉特是美国一家巨型折扣零售百货集团&#xff0c;与全球供应商建立长远深入的合作关系&#xff0c;目前国内越来越多的零售产品供应商计划入驻Target。完成入驻资格审查之后&#xff0c;Target会向供应商提出EDI对接邀请&#xff0c;企业需要根据指示完成供应商EDI信息…