聊聊单点登录(SSO)中的CAS认证
SSO介绍
背景
- 随着企业的发展,一个大型系统里可能包含 n 多子系统, 用户在操作不同的系统时,需要多次登录,很麻烦,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录。
- web 系统 由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论 web 系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问 web 系统的整个应用群与访问单个系统一样,登录/注销 只要1次就够了

SSO 定义
- SSO(Single sign-on) 即单点登录,一种对于许多相互关联,但是又是各自独立的软件系统,提供访问控制的方法
- SSO(Single sign-on) 是比较流行的企业业务整合的解决方案之一。SSO(Single sign-on) 定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
以游乐场的通票为例:
我们只要买一次通票,就可以玩所有游乐场内的设施,而不需要在过山车或者摩天轮那里重新买一次票。在这里,买票就相当于登录认证,游乐场就相当于使用一套 SSO 的公司,各种游乐设施就相当于公司的各个产品。

类比到各个子系统认证,如图

SSO 三种类型
各子系统在同一个站点下
各子系统在相同的顶级域名下
同一个站点和相同顶级域下的单点登录是利用了 Cookie 顶域共享的特性。目前数栈都是只需要在 UIC 的登录页面进行一次登录就可以在各个子应用之间进行跳转,这种操作源于根据设置 Cookie 中的 domain 为顶级域名。
各子系统属于不同的顶级域
如果属于不同的域,不同域之间的 Cookie 是不共享的。怎么办?接下来就要说一说 CAS (Central Authentication Service) 流程了,这个流程是单点登录的标准流程
CAS (Central Authentication Service)
CAS 是什么
Central Authentication Service ——— 中央认证服务,是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。只是 SSO 解决方案的一种,它的流程其实跟 Cookie-session 模式是一样的,单点登录等于说是每个子系统都拥有一套完整的 Cookie-session 模式,再加上一套 Cookie-session 模式的 SSO 系统。

第一次访问 APP1:
- 用户访问 APP1,需要登录的时候会重定向到 CAS Server
- 在 CAS Server 进行账号密码认证,CAS Server 会保存 session,并生成 sessionId 返回给 SSO Client,SSO Client 写入当前域的 Cookie,同时根据 TGT 签发1个 ST 传入 APP1
- APP1 携带 ST 向 CAS Server 请求校验
- CAS Server 校验成功后,返回 登录态给 APPI 服务端
- APPI 服务端 将 登陆态写入 session 并生成 sessionId 返回给 APPI Client
- 之后再做登录认证,就是同域下的认证了
第一次访问 APP2:
- 用户访问系统 APP2,当跳到 SSO 里准备登录的时候发现 SSO 已经登录了,那 SSO 生成一个 ST,携带该 ST 传入 APP2
- APP2 携带 ST 向 CAS Server 请求校验
- CAS Server 校验成功后,返回 登录态给 APP2 服务端
- APP2 服务端 将 登陆态写入 session 并生成 sessionId 返回给 APPI Client
- 在这个流程里,APP2 就不用走登录流程了
CAS 票据
TGT
CAS Server 创建TGT,存在 CAS Server 的 Session 里面,根据用户信息签发的
TGC
创建 TGT 的同时,生成 TGC。通过 CAS Server 的 response header 的 set-cookie 字段设置 TGC,唯一标识用户身份(sessionId) ST
ST
根据 TGT 签发的 ST,是 CAS 为用户签发的访问某一 service 的票据

CAS 单点登录(SSO) & 单点登出(SLO)
单点登录(SSO)

第一次访问 APP1:
- 访问 APP1 服务地址,APP1 请求未通过认证,重定向至 CAS Server 地址。
- 访问 CAS Server 地址,发送认证请求,带上 Cookie。
- CAS Server 识别出用户没有 Cookie 信息,没有登录,返回 CAS 登陆页地址。
- 用户输入正确的账户密码,CAS Server 用户认证通过,创建 SSO Session。
- 重定向回 APP1 的服务地址,并在 cookie 中创建了 CASTGC,TGC 中包含了 Ticket(TGT),TGT 就是 SSO Session 的 key。
- 访问 APP1 的服务地址,并带上 ST,客户端拿到 ST 向CAS Server进行认证。
- CAS Server 认证成功,返回响应信息给 APPI
- APPI 拿到成功的响应后,设置 Session,并重定向回 APP1 的地址,并设置 Cookie JSESSIONID。
- APPI 发起请求,带上 Cookie 中的信息,其中 JSESSIONID 用来确定当前用户所对应的 session 信息,发送给客户端进行校验。
- 客户端使用 JSESSIONID 与 Session 中存储的数据进行校验。
- 校验通过,返回正确的内容,展示 APP1
第二次访问 APP1:
- APPI 发起请求,并带上 Cookie 中的 JSESSIONID 给 APPI 服务端。
- APPI 服务端 使用 JSESSIONID 与 Session 中存储的数据进行校验。
- 校验通过,返回正确的内容,展示 APP1 。

在 APP1 登陆成功的情况下,第一次访问 APP2:
- 访问 APP2 服务地址,APP2 请求未通过认证,重定向至 CAS Server 地址。
- 访问 CAS Server 地址,发送认证请求,带上 TGT 信息。
- CAS Server 通过 TGT 去查找 SSO 的信息进行认证。
- 认证通过,生成票据 ST 重定向至 APP2 的服务地址。
- APP2 服务 携带 ST 向 CAS Server 进行认证。
- CAS Server 认证成功,返回客户端通过的响应。
- 客户端拿到成功的响应后,设置 Session,并重定向至 APP2 的地址,并设置 Cookie MOD_AUTH_CAS_S。
- APP2 发起请求,带上 Cookie 中的 MOD_AUTH_CAS_S ,发送给客户端进行校验。
- 客户端使用 MOD_AUTH_CAS_S 与 Session 中存储的数据进行校验。
- 校验通过,返回正确的内容,展示 APP2。
单点登出(SLO)
- 在 APP1 平台 请求退出登录后, 先在 query 中 携带 service 字段 重定向 CAS 登出地址
- 用户携带 service query 字段和 CASTGC 请求到 CAS Server
- CAS Server 根据 CASTGC 找到 TGT的信息,删除 TGT 完成 CAS 的注销
- CAS Server 可以在 TGT 中拿到关联的所有 ST, 根据 ST 找到对应的应用注册信息,调用其中的 logoutUrl,把 ST 包装到 logoutRequest 发送给 APP1
- APP1 根据 logoutRequest 找到 ST ,查找 Session 中以 ST 为键的值删除,清除登陆状态
- APP1 登出成功
- APP2 根据 logoutRequest 找到 ST ,查找 Session 中以 ST 为键的值删除,清除登陆状态
- APP2 登出成功

聊聊单点登录(SSO)中的CAS认证的更多相关文章
- cas单点登录 SSO 的实现原理
原文出处: cutesource 欢迎分享原创到伯乐头条 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户 ...
- CAS单点登录(SSO)完整教程
转:http://blog.csdn.net/frinder/article/details/7969925 CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的 ...
- 单点登录(一)-----理论-----单点登录SSO的介绍和CAS+选型
什么是单点登录(SSO) 单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录. 单点登录(Single Sign On),简称为 ...
- [转]单点登录SSO学习——CAS协议内容
作者:anmaler 本文转自:http://blog.zhaojunling.me/p/24 CAS中文文档甚少,这篇文章对CAS接口参数有比较清楚的说明,排版也不错查阅舒适 在当前互联网产品中使用 ...
- [置顶] SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错
这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周.现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错 ...
- cas 单点登录(SSO)实验之二: cas-client
cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...
- cas 单点登录(SSO)之一: jasig cas-server 安装
cas 单点登录(SSO)实验之一: jasig cas-server 安装 参考文章: http://my.oschina.net/indestiny/blog/200768#comments ht ...
- SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错
这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周.现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错 ...
- cas 单点登录(SSO)之中的一个: jasig cas-server 安装
cas 单点登录(SSO)实验之中的一个: jasig cas-server 安装 參考文章: http://my.oschina.net/indestiny/blog/200768#comments ...
随机推荐
- MySQL数据检索时,sql查询的结果如何加上序号
1.sql语法 @i:类型java定义的变量 @i:=0:这里类似给i初始化值为0 @i:=@i+1 :每次从0开始递增+1 SELECT (@i:=@i+1) as id,TDLINE FROM Y ...
- NC16597 [NOIP2011]聪明的质监员
NC16597 [NOIP2011]聪明的质监员 题目 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿 ...
- 抓包整理外篇fiddler———— 会话栏与过滤器[二]
前言 简单介绍一下会话栏和过滤器 正文 在抓包的时候这两个可以说是必用吧. 会话栏: 会话栏我这里介绍根据左边部分和右边部分. 左边部分是一些图标,有些人发现有个习惯,不习惯看图标. 其实说白了,我们 ...
- C++简单工厂模式的学习
我们先从最常见的C++类的一个实现开始说起, class API { public: virtual test(std::string s)=0; protected: API(){}; }; cla ...
- springboot集成swagger2报Illegal DefaultValue null for parameter type integer
springboot集成swagger2,实体类中有int类型,会报" Illegal DefaultValue null for parameter type integer"的 ...
- 【黄啊码】MySQL入门—3、我用select *,老板直接赶我坐火车回家去,买的还是站票
大家好!我是黄啊码,学会了DDL语句了吗?那我们今天就来学习一下基本的查询语法,我见过很多外包机构的程序员都是万物皆可select *,然后项目跑了一段时间就基本跑不动了,问就回答:服务器配置不够,加 ...
- 第二十天python3 正则表达式
正则表达式 Regular Expression,缩写为regex.regexp.RE等:分类 1.BRE 基本正则表达式,grep.sed.vi等软件支持,vim有扩展: 2.ERE 扩展正则表达式 ...
- python 生成Windows快捷方式
此处以虚拟机镜像快捷方式为例 link_filepath:快捷方式的生成路径 win32_cmd:需要执行的应用程序 arg_str:exe的参数 快捷方式的目标:由win32_cmd + arg_s ...
- 20220724-Java的继承
目录 含义 代码示例 使用方法和注意事项 个人理解 含义 继承Extends 面向对象最显著的一个特性,继承是从已有的类中派生出新的类,新的类能吸收已有类的性和方法,并能扩展新的能力. 代码示例 cl ...
- SingleSphere类定义
针对于单个球体的碰撞,其实和多个球体一样的,只是我修改了书上的代码,定义了这么多类,终于到头了.马上就要展示奇迹的时候了. 类定义: #pragma once #ifndef __SINGLESPHE ...