CAS原理技术

news2024/11/20 21:33:35

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.coloradmin.cn/o/1707215.html

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

相关文章

GitLab项目中添加用户,并设置其角色权限等

注意:创建用户(new user),创建完用户然后再项目邀请用户,选择创建过的用户 一、以管理员身份登录GitLab的WebUI并创建用户 1>.使用管理员登录GitLab 使用管理员(root)用户登录成功后,点击如下图所示的小扳手,点击…

废品回收小程序:回收市场下的商业机遇

随着当下大众环保意识的提升,回收行业收到了大众的重视,行业快速发展。在互联网信息技术的支持下,“互联网废品回收”得到了发展,依靠各种技术搭建互联网回收平台,连接到居民与商家,让回收变得更加简单高效…

小猪APP分发:让你的应用轻松上架,免费分发

你是否曾经因为应用无法顺利上架而烦恼?或者,刚刚开发好的应用找不到一个合适的平台进行分发?其实,这些问题都不再是问题,因为“小猪APP分发”来了! 每个开发者都希望自己的应用能够被更多的人下载和使用&…

抖店怎么选品?抖店爆款选品思路技巧,新手直接用!

大家好,我是电商花花。 抖店选品永远是我们做抖店,做电商的核心,店铺想要出单,想要赚钱,我们就一定要学会怎么选品,怎么筛选商品。 而我们绝大多数新手并没有办法保证持续选爆款的能力,如果店…

2024年最新实景无人自动直播软件揭秘:降低成本,提升效率

在信息技术迅猛发展的时代,实景无人自动直播软件成为了各行各业的关注焦点。随着2024年的到来,最新的实景无人自动直播软件将以其降低成本、提升效率的特点引领行业。本文将揭秘这一创新软件的工作原理,并探讨其在各个领域的应用,…

简谈SUID提权

SUID提权 0x01什么是SUID ​ SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可…

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys枕式包装机运动控制器

枕式包装机是一种包装能力非常强,且能适合多种规格用于食品和非食品包装的连续式包装机。它不但能用于无商标包装材料的包装,而且能够使用预先印有商标图案的卷筒材料进行高速包装。同时,具有稳定性高、生产效率高,适合连续包装、…

场景题11111

关单操作? 优先考虑定时任务、Redissonredis、RocketMQ延迟消息实现(订单量特别大的时候,不建议使用MQ) 每个订单都有一个消息会增加资源消耗可靠性问题(丢失)大量的无效消息不是所有消息队列都支持一般通…

轻兔推荐 —— vfox

简介 vfox 是一个跨平台且可扩展的版本管理工具,终于有一个可以管理所有运行环境的工具了 - 支持一键安装 Java、Node.js、Flutter、.Net、Golang、PHP、Python等多种环境 - 支持一键切换不同版本 特点 支持Windows(非WSL)、Linux、macOS! 支持不同项目不同版本、…

2、PHP 8.1.0-dev 后门远程命令执行漏洞复现

1、青少年ctf,题目PHP后门 2、页面 3、bp抓包发现PHP版本为8.1.0-dev 4、尝试使用以前爆出过的漏洞(网上查相关案例) User-Agentt: zerodiumvar_dump(5*5); User-Agentt: zerodiumsystem("cat /flag"); 5、查找flag User-Agentt: z…

OceanBase:列存储

目录 1、列存储的定义 1、默认创建列存表 3、指定创建列存表 4、指定创建列存行存冗余表 5、行、列存储查询测试 1、列存储的定义 行存储(Row-based Storage):行存储是以行为单位进行组织和存储数据。在这一模式下,数据库将…

第十八节:带你梳理Vue2: Vue组件中的注意事项和特例

1. Vue组件名推荐使用驼峰命名 现在我们来看看为什么在Vue中推荐注册组件时使用驼峰写法, 在了解这个之前,相信大家应该都能明白为什么在Vue中, 局部组件的使用频率高于全局组件. 推荐使用驼峰写法也是和局部组件有关系 我们先看一个示例 <div id"app"><…

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统,支持电子病历四级,saas模式

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;saas模式 HIS系统就是医院信息管理系统&#xff0c;HIS系统是整个医院信息化的核心&#xff0c;门诊、住院、药房、药库等都是由HIS系统来承载起来的&#xff0c;所以…

MATLAB | 儿童节一起来玩转MATLAB叭

hey, 儿童节要到啦&#xff0c;提前祝各位大朋友&#xff0c;小朋友儿童节快乐&#xff0c;本篇将会在前半部分给出一些有趣且简短的代码&#xff0c;在后半部分展示一下我准备的游戏大礼包里面的游戏效果&#xff0c;完整代码获取方式请见文末&#xff0c;让我们一起玩转MATLA…

【SpringBoot】单元测试实战演示及心得分享

目录 1.指定测试标准 2.设计测试用例 3.测试集示例 4.跑测试集 1.指定测试标准 单元测试会用到mock和junit的内容&#xff0c;作者前文有详解&#xff0c;可移步&#xff1a; Spring Boot单元测试-CSDN博客 mockito的详细使用-CSDN博客 1.1.测哪一层&#xff1f; 以当…

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版本&#xff0c;通过修改软链接方式进行欺骗

K8s集群中的Pod调度约束亲和性与反亲和性

前言 在 K8s 集群管理中&#xff0c;Pod 的调度约束——亲和性&#xff08;Affinity&#xff09;与反亲和性&#xff08;Anti-Affinity&#xff09;这两种机制允许管理员精细控制 Pod 在集群内的分布方式&#xff0c;以适应多样化的业务需求和运维策略。本篇将介绍 K8s 集群中…

【软考】设计模式之外观模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.为子系统中的一组接口提供一个一致的界面&#xff0c;Facade模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。2.Facade Pattern。3.是一种结构型设计模式&…

OM电商系统asp.net

OM电商系统&#xff0c;可以让顾客全面了解商品的详细信息&#xff0c;消除网上购物的信息不对称问题。通过商品分类来组织众多的商品&#xff0c;方便顾客找到所需要的商品。提供客服顾客互动机制&#xff0c;提高顾客的参与度。通过设计合理的订单处理流程&#xff0c;提高顾…

JavaSE:String类常用方法(巨详细)

1、引言 在学习C语言时&#xff0c;我们就已经了解了字符串&#xff0c;但是在C语言中字符串只能用字符数组或者指针来表示&#xff0c;没有特定的字符串类型&#xff0c;而在Java中&#xff0c;我们有了字符串这一特定的类型---String类。 2、String类的常用方法 2.1 字符串…