当前位置: 首页 > news >正文

cas 登录之后不跳转_连环画解析“单点登录”原理,保证你能看懂

单点登录( Single Sign On ,简称 SSO),是目前比较流行的企业业务整合的解决方案之一,用于多个应用系统间,用户只需要登录一次就可以访问所有相互信任的应用系统。

435d360018a89fa06c55f8bfb7aa6d01.png

图片来自 Pexels

前置介绍:

  • 同源策略,限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互,要求协议,端口和主机都相同。
  • HTTP 用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是无状态协议,所以服务器单从网络连接上无从知道客户身份。
  • 那要如何才能识别客户端呢?给每个客户端颁发一个通行证,每次访问时都要求带上通行证,这样服务器就可以根据通行证识别客户了。最常见的方案就是 Cookie。
  • Cookie 是客户端保存用户信息的一种机制,保存在客户机硬盘上。可以由服务器响应报文 Set-Cookie 的首部字段信息或者客户端 document.cookie来设置,并随着每次请求发送到服务器。子域名可以获取父级域名 Cookie。
  • Session 其实是一个抽象概念,用于跟踪会话,识别多次 HTTP 请求来自同一个客户端。
  • Cookie 只是通用性较好的一种实现方案,通常是设置一个名为 SessionID(名称可自定义,便于描述,本文均使用此名称)的 Cookie,每次请求时携带该 Cookie,后台服务即可依赖此 SessionID 值识别客户端。

单系统登录

在介绍单点登录之前,我们先来了解一下在浏览器中,访问一个需要登录的应用时主要发生的一系列流程,如下图所示:

db075bbacd138a2b883be3f81fcb3185.png

以下为连环画形式,期望能让读者更好的理解:

1c2aedcbf781db55007d5d9732984353.png
34d912311369d0fef433bc1ff78062d2.png
f0d9ea0d919a6a97e2a15d0d9ff7283a.png
fdafb13c58a43f8cc9ae7cdc7418f7fd.png
e3cd0d9e7d7afdaef4535729ca06e3e2.png
58e9452521b7ad7bcacd956401e6f554.png

依赖于登录后设置的 Cookie,之后每次访问时都会携带该 Cookie,从而让后台服务能识别当前登录用户。

题外话:后台是如何通过 SessionID 知道是哪个用户呢?

  • 数据库存储关联:将 SessionID 与数据信息关联,存储在 Redis、MySQL 等数据库中。
  • 数据加密直接存储:比如 JWT 方式,用户数据直接从 SessionID 值解密出来(此方式时 Cookie 名称以 Token 居多)。

多系统登录问题

同域名

当访问同域名下的页面时,Cookie 和单系统登录时一样,会正常携带,后台服务即可直接获取到对应的 SessionID 值,后台为单服务还是多服务无差别。

不同子域名

子域名间 Cookie 是不共享的,但各子域名均可获取到父级域名的 Cookie,即 app.demo.com与 news.demo.com均可以获取 demo.com域名下的 Cookie。

所以可以通过将 Cookie 设置在父级域名上,可以达到子域名共享的效果,即当用户在 app.demo.com 域名下登录时,在demo.com域名下设置名为 SessionID 的 Cookie。

当用户之后访问news.demo.com时,后台服务也可以获取到该 SessionID,从而识别用户。

完全不同域名

默认情况下,不同域名是无法直接共享 Cookie 的。

前端跨域带 Cookie

如果只是期望异步请求时获取当前用户的登录态,可以通过发送跨域请求到已经登录过的域名,并配置属性:

xhrFields: {   withCredentials: true } 

这样可在请求时携带目标域名的 Cookie,目标域名的服务即可识别当前用户。

但是,这要求目标域名的接口支持 CORS 访问(出于安全考虑,CORS 开启 withCredentials 时,浏览器不支持使用通配符*,需明确设置可跨域访问的域名名单)。

题外话:如果只是为了规避浏览器的限制,实现与通配*同样的效果,到达所有域名都可以访问的目的,可根据访问的 Referrer 解析请求来源域名,作为可访问名单。但是出于安全考虑,不推荐使用,请设置明确的可访问域名。

CAS

CAS(Central Authentication Service),即中央认证服务,是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法。

既然不能跨域获取,那 CAS 如何做到共享呢?它通过跳转中间域名的方式来实现登录。

页面访问流程如下图:

fed3c17c0461a87f9834a98f8ea23f08.png

以下为连环画形式,期望能让读者更好的理解:

927d6cb0841be607e094d62495cc7d72.png
2a96d013187474c8a77b7ed27c88e404.png
970952b85ccead6a0c4d7ecceb361929.png
8e86dc15d0bb69eddcbd760fa181ee07.png
e88b00149536511a14762fa6dc28e94a.png
f6736dfdf326af2c65267c3dde809f22.png
7c1b282536c5ba3b5289be9f0a56c6ee.png
c9e279b2780c507f2fca3762f591f10b.png
b86ca81c35cb8252a7c7699853a2ab37.png
27ba5389b64e0a06909e89fc3f5bd4c4.png
129ff22eb9aec0e87ec1d488d5887928.png
3d6885673b44ff84d6d6c682dcb5b38e.png
5f5ce5301fb2ba07020392447c9ff0b4.png
f22c4f63f55ef16aae181fa00065d873.png
3cb662464b2676ae6d310f18c266ae7b.png
355f8b47e03aa13739c0d66eb9843ba6.png
fdf85b54d673b1cf3950254c27f45eee.png
7f72203581e58d576203da85c4a42a80.png
db0c7de512989194c7b2a54354b70802.png

其中需要关注以下 2 点:

  • 所有的登录过程都依赖于 CAS 服务,包含用户登录页面、ST 生成、验证。
  • 为了保证 ST 的安全性,一般 ST 都是随机生成的,没有规律性。
  • CAS 规定 ST 只能保留一定的时间,之后 CAS 服务会让它失效,而且,CAS 协议规定 ST 只能使用一次,无论 ST 验证是否成功,CAS 服务都会清除服务端缓存中的该 ST,从而规避同一个 ST 被使用两次或被窃取的风险。

相关文章:

  • int数据类型范围_数据类型之间的转换
  • python接入图灵机器人_python3 调用图灵机器人API实现语音聊天
  • 排队论仿真软件_LINGO 实现M / M / s / s 损失制排队模型
  • http服务器_http服务器
  • python相关知识介绍_Python基础知识(一)—简介
  • easyui datagrid url不请求请求_渗透或CTF中使用请求头绕过认证模式
  • 子程序调用与宏定义的异同_新代系统:宏编程的基本概念和基本书写格式
  • python小结和体会_Python学习心得总结
  • jar包对比工具_如何下载Commons下的IO组件以及工具类的使用
  • recyclerview放不同的布局_一页PPT,7种不同的修改方法!非常好用!
  • python二维数组变成三维数组_Python reshape的用法及多个二维数组合并为三维数组的实例...
  • dockerhub删除镜像_Docker镜像获取(gcr.io等)
  • excel量化交易模板_使用EXCEL计算并绘制ATR指标
  • js json转string_我从Vue源码中学到的一些JS编程技巧
  • 应用程序拒绝访问_照片视频不要乱拍,超过1000个APP,拒绝权限后也能收集数据...
  • 收藏网友的 源程序下载网
  • [nginx文档翻译系列] 控制nginx
  • [译] 怎样写一个基础的编译器
  • 【comparator, comparable】小总结
  • 【翻译】babel对TC39装饰器草案的实现
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • docker python 配置
  • JS题目及答案整理
  • SQLServer之索引简介
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 高性能JavaScript阅读简记(三)
  • 老板让我十分钟上手nx-admin
  • 浏览器缓存机制分析
  • 浅谈Golang中select的用法
  • 巧用 TypeScript (一)
  • 深入浏览器事件循环的本质
  • 数组的操作
  • 小程序测试方案初探
  • 协程
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 字符串匹配基础上
  • 走向全栈之MongoDB的使用
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 通过调用文摘列表API获取文摘
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (pojstep1.3.1)1017(构造法模拟)
  • (ros//EnvironmentVariables)ros环境变量
  • (windows2012共享文件夹和防火墙设置
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (剑指Offer)面试题34:丑数
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)JPA - JQPL 实现增删改查
  • (转)LINQ之路
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET Core 实现 Redis 批量查询指定格式的Key