SSO

【转自】https://www.cnblogs.com/btgyoyo/p/10722010.html

SSO 是英文 Single Sign On 的缩写,翻译过来就是单点登录。顾名思义,它把两个及以上个产品中的用户登录逻辑抽离出来,达到只输入一次用户名密码,就能同时登录多个产品的效果。

打个比方,SSO 和我们去迪士尼玩时购买的通票很像。

我们只要买一次通票,就可以玩所有游乐场内的设施,而不需要在过山车或者摩天轮那里重新买一次票。在这里,买票就相当于登录认证,游乐场就相当于使用一套 SSO 的公司,各种游乐设施就相当于公司的各个产品。

使用 SSO 的优点很明显:

  • 提升用户体验。

就以我厂为例。我厂有两个产品,丁香人才网和丁香园论坛,假如你是我厂用户,肯定无法忍受登录丁香园论坛的时候输入一次用户名密码,登录人才网又要输入一次用户名密码吧?

  • 避免重复开发

假如你是我厂后端,每天任务都饱和的不行,肯定无法忍受到人才网开发一套登录逻辑,到论坛又开发一套登录逻辑吧?

  • 提升安全系数

假如你是我厂运维,发现了一个安全隐患需要紧急修复。你肯定无法忍受给茫茫多的产品后端都发一封邮件,责令修复吧?万一漏了一个呢?

综合看来,SSO 不仅是有用的,而且是必要的。

CAS

SSO 仅仅是一种架构,一种设计,而 CAS 则是实现 SSO 的一种手段。两者是抽象与具体的关系。当然,除了 CAS 之外,实现 SSO 还有其他手段,比如简单的 cookie。

CAS (Central Authentication Service)中心授权服务,本身是一个开源协议,分为 1.0 版本和 2.0 版本。1.0 称为基础模式,2.0称为代理模式,适用于存在非 Web 应用之间的单点登录。本文只涉及 CAS 1.0,下文中将详细介绍。

SSO 的演进与分类

下面详述一下各种场景下的 SSO,它们之间是逐步升级,逐步复杂化的关系。

1.同域 SSO

如图,同域 SSO 是最简单的一种情况。

此时,两个产品都是在一个域名下,单点登录是很自然的选择。我们来捋一捋步骤,搞清楚这里的步骤是理解后文的基础,千万不要跳过。

  1. 用户访问产品 a,向 后台服务器发送登录请求。
  2. 登录认证成功,服务器把用户的登录信息写入 session。
  3. 服务器为该用户生成一个 cookie,并加入到 response header 中,随着请求返回而写入浏览器。该 cookie 的域设定为 http://dxy.cn。
  4. 下一次,当用户访问同域名的产品 b 时,由于 a 和 b 在同一域名下,也是 http://dxy.cn,浏览器会自动带上之前的 cookie。此时后台服务器就可以通过该 cookie 来验证登录状态了。

实际上,这种场景就是最简单最传统的登录操作。虽然我们把产品 a 和 b 人为分开了,但由于它们在同域上,就算看成是同一产品的不同类目也未尝不可。我们没有设置独立的 SSO 服务器,因为业务后台服务器本身就足以承担 SSO 的职能。

2.同父域 SSO

同父域 SSO 是同域 SSO 的简单升级,唯一的不同在于,服务器在返回 cookie 的时候,要把cookie 的 domain 设置为其父域。

比如两个产品的地址分别为 http://a.dxy.cn 和 http://b.dxy.cn,那么 cookie 的域设置为 http://dxy.cn 即可。在访问 a 和 b 时,这个 cookie 都能发送到服务器,本质上和同域 SSO 没有区别。

3.跨域 SSO

可以看到,在上面两种情况下,我们都没有专门设置 SSO 服务器。但是当两个产品不同域时,cookie 无法共享,所以我们必须设置独立的 SSO 服务器了。这个时候,我们就是通过标准的 CAS 方案来实现 SSO 的。下面我们就来详细介绍一下:

详解CAS

CAS 1.0 协议定义了一组术语,一组票据,一组接口。

术语:

  • Client:用户。
  • Server:中心服务器,也是 SSO 中负责单点登录的服务器。
  • Service:需要使用单点登录的各个服务,相当于上文中的产品 a/b。

接口:

  • /login:登录接口,用于登录到中心服务器。
  • /logout:登出接口,用于从中心服务器登出。
  • /validate:用于验证用户是否登录中心服务器。
  • /serviceValidate:用于让各个 service 验证用户是否登录中心服务器。

票据

  • TGT:Ticket Grangting Ticket

TGT 是 CAS 为用户签发的登录票据,拥有了 TGT,用户就可以证明自己在 CAS 成功登录过。TGT 封装了 Cookie 值以及此 Cookie 值对应的用户信息。当 HTTP 请求到来时,CAS 以此 Cookie 值(TGC)为 key 查询缓存中有无 TGT ,如果有的话,则相信用户已登录过。

  • TGC:Ticket Granting Cookie

CAS Server 生成TGT放入自己的 Session 中,而 TGC 就是这个 Session 的唯一标识(SessionId),以 Cookie 形式放到浏览器端,是 CAS Server 用来明确用户身份的凭证。

  • ST:Service Ticket

ST 是 CAS 为用户签发的访问某一 service 的票据。用户访问 service 时,service 发现用户没有 ST,则要求用户去 CAS 获取 ST。用户向 CAS 发出获取 ST 的请求,CAS 发现用户有 TGT,则签发一个 ST,返回给用户。用户拿着 ST 去访问 service,service 拿 ST 去 CAS 验证,验证通过后,允许用户访问资源。

票据之间的关系如下图。注意,PGTIOU, PGT, PT 是 CAS 2.0 中的内容,感兴趣的同学可以自行了解。

详细步骤

看到这里,是不是又有点晕了?没关系,下面我们借助一个简单的场景,再来仔细捋一捋用 CAS 实现 SSO 的详细步骤,顺便加深理解之前提出的概念。

开始!

  1. 用户访问产品 a,域名是 http://www.a.cn。
  2. 由于用户没有携带在 a 服务器上登录的 a cookie,所以 a 服务器返回 http 重定向,重定向的 url 是 SSO 服务器的地址,同时 url 的 query 中通过参数指明登录成功后,回跳到 a 页面。重定向的url 形如 http://sso.dxy.cn/login?service=https%3A%2F%2Fwww.a.cn。
  3. 由于用户没有携带在 SSO 服务器上登录的 TGC(看上面,票据之一),所以 SSO 服务器判断用户未登录,给用户显示统一登录界面。用户在 SSO 的页面上进行登录操作。
  4. 登录成功后,SSO 服务器构建用户在 SSO 登录的 TGT(又一个票据),同时返回一个 http 重定向。这里注意:
  • 重定向地址为之前写在 query 里的 a 页面。
  • 重定向地址的 query 中包含 sso 服务器派发的 ST。
  • 重定向的 http response 中包含写 cookie 的 header。这个 cookie 代表用户在 SSO 中的登录状态,它的值就是 TGC。
  • 浏览器重定向到产品 a。此时重定向的 url 中携带着 SSO 服务器生成的 ST。
  • 根据 ST,a 服务器向 SSO 服务器发送请求,SSO 服务器验证票据的有效性。验证成功后,a 服务器知道用户已经在 sso 登录了,于是 a 服务器构建用户登录 session,记为 a session。并将 cookie 写入浏览器。注意,此处的 cookie 和 session 保存的是用户在 a 服务器的登录状态,和 CAS 无关。
  • 之后用户访问产品 b,域名是 http://www.b.cn。
  • 由于用户没有携带在 b 服务器上登录的 b cookie,所以 b 服务器返回 http 重定向,重定向的 url 是 SSO 服务器的地址,去询问用户在 SSO 中的登录状态。
  • 浏览器重定向到 SSO。注意,第 4 步中已经向浏览器写入了携带 TGC 的cookie,所以此时 SSO 服务器可以拿到,根据 TGC 去查找 TGT,如果找到,就判断用户已经在 sso 登录过了。
  • SSO 服务器返回一个重定向,重定向携带 ST。注意,这里的 ST 和第4步中的 ST 是不一样的,事实上,每次生成的 ST 都是不一样的。
  • 浏览器带 ST 重定向到 b 服务器,和第 5 步一样。
  • b 服务器根据票据向 SSO 服务器发送请求,票据验证通过后,b 服务器知道用户已经在 sso 登录了,于是生成 b session,向浏览器写入 b cookie。

如图所示,至此,整个登录流程结束。之后当用户访问 a 或者 b 后,直接会携带 a cookie/b cookie,就不用再向 SSO 确认了。

实际开发时,可以根据 CAS 增加更多的判断逻辑,比如,在收到CAS Server签发的ST后,如果 ST 被 hacker 窃取,并且 client 本身没来得及去验证 ST,被 hacker 抢先一步验证 ST,怎么解决。此时就可以在申请 ST 时添加额外验证因子(如ip、sessionId等)。

https://www.cnblogs.com/btgyoyo/p/10722010.html

【单点登录】什么是 SSO 与 CAS?相关推荐

  1. pigx-cas 单点登录(一)——初识SSO

    pigx-cas 单点登录(一)--初识SSO @(Pigx)[笔记, 单点, 登录] 前言:工作中目前采用CAS,从零开始学习与生产应用实践,这里针对模块知识点,根据本机逐渐记录. 初始CAS 单点 ...

  2. 单点登录系统(SSO)详细设计说明书(下篇)

    单点登录系统(SSO)详细设计说明书(下篇) 收藏 3.3输入输出要求 解释各输入输出数据的类型,并逐项对格式.数值范围.精度等作出准确定义.对软件的数据输出及必须标明的控制输出量进行解释并举例,包括 ...

  3. CAS实现单点登录方案(SSO完整版)

    一.简介 1.cas是由耶鲁大学研发的单点登录服务器 2.本教材所用环境 Tomcat7.2 JDK1.7 CAS Service 版本    cas-server-3.4.8-release CAS ...

  4. CAS单点登录(一)——初识SSO

    前言:其实好早就想把CAS的这一套知识整合一下,在工作上也应用到了这块,只是最近才在工作上接触到CAS,所以刚好把这些知识总结一下.这块可能是一个比较大的模块知识点,所以会有多篇文章进行逐一展开,笔者 ...

  5. 统一认证管理系统(单点登录系统)sso 浅谈

    我所在的公司比较大,内部的各种管理系统和业务系统比较多,然而所有的系统都可以用公司的OA的员工工号和密码直接进行登录 (当然登录界面都是一个就是内部OA门户).从进入公司以来我就一直有个问题,这是怎么 ...

  6. SSO单点登录(集成SSO认证服务)

    文章目录 引言 1. 集成xxl-sso-core 2. 集成xxl-server 总结 引言 主要讲解了SSO单点登录的一些概念,以及使用国产的XXL-SSO单点登录例子来熟悉了单点登录的整个流程. ...

  7. 单点登录系统(SSO)详细设计说明书

    1.引言 1.1编写目的 为了单点登录系统(SSO系统)的可行性,完整性,并能按照预期的设想实现该系统,特编写需求说明书. 同时,说明书也发挥与策划和设计人员更好地沟通的作用. 1.2背景 a.鉴于集 ...

  8. 《果然新鲜》电商项目(36)-SSO单点登录(集成SSO认证服务)

    文章目录 引言 1. 集成xxl-sso-core 2. 集成xxl-server 总结 引言 在上一篇博客<果然新鲜电商项目(35)-SSO单点登录(XXL-SSO案例)>,主要讲解了S ...

  9. java实现单点登录_JAVA实现SSO单点登录

    一.概述 1.1.SSO介绍 SSO全称:SingleSignOn,几个相互信任的应用之间,在其中一个应用进行登录以后,其他信任的应用直接免登. 例如:新浪下的博客和微博.在网页上同时打开后都没登录, ...

  10. 【Python开发】Flask中的单点登录解决方案

    Flask中的单点登录解决方案 1.SSO 和 CAS 单点登录(Single Sign On,SSO)就是通过用户的一次性鉴别登录.当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其 ...

最新文章

  1. 面试:你了解中兴吗_HTTP简介:您需要了解的所有内容
  2. python newbie——PE No.5
  3. android第三次作业
  4. linux网卡设置详解,史上最详细的Linux网卡ifcfg-eth0配置详解
  5. 博客园升级有感一点建议
  6. H.264中IDR帧和I帧区别
  7. Linux中fork的秘密
  8. 分布式训练PyTorch 源码解读
  9. Sunday算法模板
  10. 由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。
  11. a标签js阻止跳转_前端笔试知识点:阻止冒泡
  12. matlab绘制二元一次函数图像_二元一次函数曲线拟合的Matlab实现.pdf
  13. Cnskype移动办公现状分析管理
  14. Java基础加强重温_06:可变参数、集合工具类Collections类、冒泡排序、Map集合、Map集合遍历、Map案例、LinkedHashMap集合、图书管理系统
  15. 全面剖析canonical标签
  16. 信用风险频发背后:11月约600亿信用债发行取消
  17. 视觉SLAM中的公制尺度(metric scale)
  18. java mp4 合并_使用 Python 把多个 MP4 合成一个视频
  19. 华为2018实习面试+状态总结
  20. 【Tableau 设计提示8.0】在 Tableau 中使用形状的 10 个技巧

热门文章

  1. 搭建syslog服务器+log4j2输出日志到syslog
  2. 电脑经常弹出“不支持的硬件”解决办法
  3. 如何使用sharemouse共享鼠标
  4. c语言malloc,calloc,realloc函数介绍
  5. C语言malloc申请空间函数的两种返回方法
  6. Arduino重磅更新!IDE 2.0来了
  7. CRM的终点是CSM(客户成功)
  8. lifi与wifi的论文_对比LiFi和WiFi之间的差别 可见光通信大热原因揭秘
  9. html、css 实现轮播图的静态样式
  10. html点击小图轮播图,使用纯CSS实现点击轮播图效果,无js。