手撕公司SSO登陆原理
Single Sign-on
SSO是老生常谈的话题了,但部分同学对SSO可能掌握的也是云里雾里,一知半解。本次手撕公司的SSO原理,试图以一种简单、流畅的形式为你提供有用的SSO原理。
按照本人一贯行文风格,我们先说什么是SSO,为什么要提出SSO?
SSO: 在多个系统中,只需要登录一次,就可以访问其他相互信任的应用系统,表现的实际场景:
企业部署多个website,形成产品套件或产品矩阵,而账号集中统一管理
用户一次登录,即可畅通不同域名下web服务
今天我们主要讲不同顶域下SSO的实现,引出CAS原理,CAS传送门:
手绘原理
用户首次访问website1
① 用户访问website1,website1需要认证, 用户当前没有登录
② website1给浏览器返回302重定向, 浏览器重定向到SSO服务页:www.sso-website.com?service=https://www.website1.com
context.Response.Redirect(ssoURL, false); // 临时跳转,建议传参false返回302标准重定向响应
用户并没有登录SSO系统,所以SSO系统会返回登录界面
③ 用户在SSO登录页输入账户/密码
④ 登录成功,SSO会在浏览器写入Cookie for sso[官方叫CASTGC]并产生一个302重定向,浏览器将重定向到原website1地址,并携带与此次SSO认证成功的ticket(ST)
http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO
⑤ website1收到以上重定向请求,解析QueryString中的ticket, 向SSO做一次ticket验证;
⑥⑦ 验证通过之后,会写入本站的Cookie for website1, 同时会302重定向要求回到业务首页:www.website1.com。
已认证用户访问website2
① 用户访问website2,用户在website2域并没有认证;跳转回www.sso-website.com?service=https://www.website2.com
② SSO检测到该用户在SSO域下存在Cookie for sso, 认定该用户已经登录,故跳转回www.website2.com?ticket=XXXX-OOOO-XXXX-OOOO, 如上也会携带认证ticket
③ 如上,website2收到 website2.com?ticket=XXXX-OOOO-XXXX-OOOO请求,在做一次SSO验证; 验证成功,写入本站Cookie for website2
重难点解读
① SSO认证成功,写入的cookie for sso, 是登录到其他系统的关键
② website1收到SSO发起的重定向请求,解析出ticket=XXXX-OOOO-XXXX-OOOO, 为什么还要做一次SSO验证?
因为website1收到的带ticket请求,有可能是伪造(复制别人的带ticket地址 www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO,实际没有sso登录), 所以在website1中需要去SSO验证一次(sso会验证这个ticket在sso站点是否已经是登录用户)。
③ 标准的CAS登录流程有三次302浏览器重定向, 分别由原站点website1启动2次和SSO启动一次
理论上流程由服务端重定向也是可以的 ?? 看官若发现有漏洞,可在评论区回复。
20200201 更新,三次跳转均不可使用服务端跳转!!!
第一次website1重定向回 sso.com,第二次SSO重定向回 website1.com不能使用服务端重定向, 服务端重定向相当于A站点请求了B站点的资源,浏览器地址并不会改变, 这样的操作导致此流程并不能产生独立的 Cookie for sso, Cookie for website1, 故不能使用服务端跳转, 应保持302 跳转(这是HTTP协议的行为)。
对于第三次重定向,发生在最后一步:跳转回首页 website1.com,页面其他资源需使用刚写入的Cookie for website1,故此处也不可使用 服务端跳转。
④ 退出SSO登录, 要做两件事情:
- 向SSO发起api请求,请求SSO删除用户在SSO域下的认证cookie for sso
- 移除本站的cookie for website1
⑤ 每个website,至少需要如下sso配置
"SsoOptions": {
"BaseAddress": "https://sso-cas.sso.com", // 基地址
"LoginPath": "/login", // sso登录地址
"LogoutPath": "/api/logout", // 退出sso登录的api地址
"ValidateTGTPath": "/api/validate", // 验证ticket的api地址
"UserInfoPath": "/api/v2/userinfo" // 从sso拿到登录用户信息的api地址
},
That' all,这是自己对SSO登录的一些理解, 本图文希望以流畅的思路记录SSO流程, 各位看官不要吃快餐,知其然更知其所以然很关键。
手撕公司SSO登陆原理的更多相关文章
- 编译原理--05 用C++手撕PL/0
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...
- 手撕spring核心源码,彻底搞懂spring流程
引子 十几年前,刚工作不久的程序员还能过着很轻松的日子.记得那时候公司里有些开发和测试的女孩子,经常有问题解决不了的,不管什么领域的问题找到我,我都能帮她们解决.但是那时候我没有主动学习技术的意识,只 ...
- MVC4/5+jquery+bootstrap样式+dataTables+linq+WCF+EF6后台和前台的框架集合!好蛋疼哦!数据库支持MYSQL 和MSSQL,oracle。集成腾讯企业邮箱收邮件同步用户SSO登陆等功能。
花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才 ...
- NN入门,手把手教你用Numpy手撕NN(2)
这是一篇包含较少数学推导的NN入门文章 上篇文章中简单介绍了如何手撕一个NN,但其中仍有可以改进的地方,将在这篇文章中进行完善. 误差反向传播 之前的NN计算梯度是利用数值微分法,虽容易实现,但是计算 ...
- 优雅手撕bind函数(面试官常问)
优雅手撕bind函数 前言: 为什么面试官总爱让实现一个bind函数? 他想从bind中知道些什么? 一个小小的bind里面内有玄机? 今天来刨析一下实现一个bind要懂多少相关知识点,也方便我们将零 ...
- 用C/C++手撕CPlus语言的集成开发环境(1)—— 语言规范 + 词法分析器
序言 之所以叫做CPlus语言,是因为原本是想起名为CMinus的,结果发现GitHub和Gitee上一堆的CMinus的编译器(想必都是开过编译原理课程并且写了个玩具级的语言编译器的大佬们吧).但是 ...
- 面试中的MySQL主从复制|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第三篇文章,今天讲解使用bin log实现主从复制的功能.主从复制也是MySQL集群实现高可用.数据 ...
- java实现二叉树的Node节点定义手撕8种遍历(一遍过)
java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...
- Palm是一家英國智能手機公司
據TCL方面介紹,本次收購只涉及品牌,不會涉及員工和其他資產.被收購之後,Palm仍將繼續把總部設於美國加州矽谷,以發揮該區域所獨有的先進技術和人才的優勢. TCL通訊CEO郭愛平表示TCL將把Pal ...
随机推荐
- .net core 3.0 Signalr - 09 待改进&交流
## 个人心得 写博客真的比写代码累,膜拜那些坚持写博客的大佬! 有时候零散的片段比较多,没写之前感觉有千千万万要写的东西,实际写的时候发现, 好像这个没啥说的,然后就帖了个图,或者一笔带过了 ## ...
- 无广告版本Flash player 一枚,需要的拿走~
无广告版本flashplayer,国内flashplayer已经被植入了广告,安装后不断的弹出广告使用体验很差,最开始还以为是电脑被恶意植入捆绑插件, 检查半天发现竟然是浏览器的flash playe ...
- jquery图片放大插件鼠标悬停图片放大效果
都知道jquery都插件是非常强大的,最近分享点jquery插件效果,方便效果开发使用. 一.HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- MySQL-时区导致的时间前后端不一致
背景 今天早上刚上班,就被同事提示,程序的日期处理有问题.数据库里日期为:2019-05-21 11:00:00 而前端显示的日期为:2019-05-21 16:00:00 分析 那肯定是和时区相关了 ...
- docker服务在Mac上的启动与使用
在mac上打开安装的docker软件就可以启动docker服务了 点击顶部状态栏中鲸鱼图标会弹出操作菜单,显示着服务的状态,如下图所示: 只有在docker服务启动了之后,才可以在终端使用docker ...
- SDI接口基于FPGA GTP实现
SDI采集和显示,基于xilinx 7系列器件进行实现,注意事项有如下几点: 1,如果多路SDI共用一个GTP Quad,或是SDI和PCIE在一个GTP Quad,时钟资源应该进行共享,既GTP c ...
- Web开发小贴士 -- 全面了解Cookie
一.Cookie的出现 浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web应用程序的实现. 针对上述 ...
- SQL SERVER数据库日常使用总结
以下内容为平时工作自己个人总结,仅供参考,欢迎交流 SELECT A.CBM,A.CMC,SUM(B.MJE)MJE FROM YXHIS..TBZDZTHZ A,YXHIS..TBZDZTMX B ...
- Maven下载速度过慢问题已解决
因为Maven 默认仓库的服务器在国外所以我们国内的使用效果极差,我们可以修改成为国内镜像地址加速下载. 两种方法 修改全局文件 C:\Users\您电脑帐号\ .m2\settings.xml没有文 ...
- Linux C++轻量级开发指南
作为一名产品开发,一套顺手的集成开发环境必不可少.大多数时候,开发经理将精力投入在产品需求分析上而忽视了研发质量甚至连基本的集成开发环境都没有统一.当然,如果你们的项目仅仅需要部署在单一的环境中或没有 ...