CAS (4) —— CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example)


tomcat版本: tomcat-8.0.29

jdk版本: jdk1.8.0_65

nginx版本: nginx-1.9.8

cas版本: cas4.1.2
cas-client-3.4.1

参考来源:

jasig.github.io:CAS protocol

CAS (1) —— Mac下配置CAS到Tomcat(服务端)

CAS (2) —— Mac下配置CAS到Tomcat(客户端)

Cas(01)——简介

Cas(09)——通过Proxy访问其它Cas应用

顺序图:(来源于http://jasig.github.io/cas/4.0.x/protocol/CAS-Protocol.html)

(1)用户首次访问(GET: https://app1.hoau.com:8413/cas1

由于ssl是本地配置,浏览器不信任当前证书,所以会提示"NET::ERR_CERT_AUTHORITY_INVALID"
详细信息如下:

点击“高级”,选择“继续前往app1.hoau.com(不安全)”

(2)此时访问未经身份验证(unauthenticated)

所以服务器将请求转到CAS,同时加上查询参数“service”。

如何实现的呢?

我们可以看到http GET请求的Header中返回的状态码是“302 Found”

Request URL: https://app1.hoau.com:8413/cas1
Status Code: 302 Found

Response Header中,

Location:https://sso.hoau.com:8433/cas/login?service=https%3A%2F%2Fapp1.hoau.com%3A8413%2Fcas1

app1服务将请求重定向(redirect)到CAS服务。

(3)浏览器向CAS服务器发起带参数的请求

Location:https://sso.hoau.com:8433/cas/login?service=https%3A%2F%2Fapp1.hoau.com%3A8413%2Fcas1

* 注意:此时客户端浏览器中可能仍然带有Cookie信息TGC与CASPRIVACY,但是在Response Header中发现,服务器会将这两个Cookie置空,并且返回一个JSESSIONID
JSESSIONID=8534DCE475C44FF446D1DE2250426B1F

此时,CAS服务器发现用户没有SSO的Session。

(4)所以返回登录页面

(5)登陆SSO(用户名/密码:test01/psw01)

可以注意到此时是用POST方法将用户名和密码,包括登陆的Ticket一起发到CAS服务器

Form:

TGC:

然后CAS服务器会对提交的用户名密码进行验证,如果验证通过。

(6)CAS服务器会做几件事情

  • 创建SSO Session
  • 创建CASTGC Cookie(这里图中为TGC)
*注意:这个Session级别的Cookie 包含Ticket Granting Ticket(TGT)的信息。
Set-Cookie:TGC=eyJhbGciOiJIUzUxMiJ9.ZXlKaGJHY2lPaUprYVhJaUxDSmxibU1pT
2lKQk1USTRRMEpETFVoVE1qVTJJbjAuLmNFck5Eb2FkWGZkQndvMDBCN2gwNmcuU0
NlVjVaSllVTjJZbmNuRURmQjdUR2tPNGZ4Ny14RXAtZnctYWRhQlBUOU4wYS1ZU0d
PaE12MXNUUkxmRG1sYVV0U1NQM0prQzBrNERUOFZvd2dJU0VmYVBMdzFGdFNtdGhp
ZDN3cE1iVHZzbUlmOXFQYkZ3Q0F3eW9Pd3pjRmJHN1hzSHI2MHBhYjh5bFZzbHhPa
W12WlpRQnJveFpVR3hRQTJ1ZVZhbkNnQ09vYkxSY0RfQ0NOQnJ4Mm5aN19ocFJOYk
Z1LVZRdTV3c2FxUmxKTS05LWFGc1otQXBPWENXOEhjQlREUHBvOUVqWFhDZ204T00
xMXUtSldKdDBCRy1BVkl0ZUlKT0FGY3VoMXd4RWdYX0EuZUQzYjRGUkhKby1IamlC
bmNnMDlPZw.WwEL14ipWvub5c2PoE-Xq38I1ssN1glPclnXA7rKt7aV0boWAuR9WaUT8lPdMeL3ycjEv0whYAnaetv_hid0
8A; Path=/cas/; Secure; HttpOnly

最后这条请求的响应会同样通过“302 Found”,将

(7)浏览器重定向到Protected App

Location:https://app1.hoau.com:8413/cas1?
ticket=ST-1-RNCht4LbpbALUYWPnR7K-cas01.sso.hoau.com

这时,浏览器会带上获得的ticket向App重新请求登陆,

(8)Protected App收到请求后

会向CAS服务器发送请求,验证ticket的合法性

(9)然后CAS服务器会返回一个XML内容

(包括成功信息,认证对象和一些其他可选参数)

* 此处(8)、(9)两步使用TCPMon接获消息查看

(10)如果成功,Protected App会相应(7)的请求

通过“302 Found”将浏览器重定向到Protected App的目标页面,同时设置Cookie的JSESSIONID

Content-Length:0
Date:Tue, 15 Dec 2015 01:56:41 GMT
Location:https://app1.hoau.com:8413/cas1;jsessionid=3D16483C31F8358A561E8EDCCC1C196D.tomcat1
Server:Apache-Coyote/1.1
Set-Cookie:JSESSIONID=3D16483C31F8358A561E8EDCCC1C196D.tomcat1; Path=/cas1/; Secure; HttpOnly

(11)浏览器带Cookie:JSESSIONID访问目标应用的页面

(12)登陆成功,Protected App返回状态码200与页面内容

再次访问同一应用

顺序图:(来源于http://jasig.github.io/cas/4.0.x/protocol/CAS-Protocol.html)

(1)浏览器带第一次认证后的Cookie:JSESSIONID访问Protected App

(2)Protected App校验Session Cookie

如果成功则返回首页。

但是在测试时遇到了问题

发现再次访问时,实际上有4段请求,与首次访问唯一不同的是少掉了用户名和密码的输入过程,但是Protected App上关于Session Cookie的校验并没有通过。

可以看到下图中Protected App在(1)时又将浏览器重定向了CAS服务器,并且又为客户端生成了新的Ticket

“ticket=ST-4-s2ffmz3oJZTax5XMV4x7-cas01.sso.hoau.com”

* 怀疑Protected App没有维持Session的状态

为了验证这个想法,我们重新访问

https://app1.hoau.com:8413/cas1

发现经过上面4段请求验证后,浏览器url上会带上jsessionid,如果将此请求参数删除,那么会重新经过4段请求。

如果不删除,而直接刷新页面,系统交互的行为则如官网上顺序图描述的行为一致。

尝试修改Protected App端的设置web.xml

增加SingleSignOutFilter

<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter> <filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

果仍然无效,还是4段请求。

尝试更换浏览器进行测试

发现IE内核的浏览器行为,和我们之前测试用的Chrome一致,如果删除url后的jsessionid,那么同样会经过4段请求。

而Firefox浏览器会有些差异,在删除url后的jsessionid后,Firefox的下次请求仍然带有cookie

* 怀疑浏览器Cookie写权限设置有问题

在Chrome浏览器中,“设置->高级->隐私设置->内容设置->Cookie”中管理例外情况,将app1.hoau.com和sso.hoau.com同时加入到例外设置中,

然后尝试去掉url后的jsessionid参数,再次访问

https://app1.hoau.com:8413/cas1

终于得到了我们想要的结果

访问同域另一应用

顺序图:(来源于http://jasig.github.io/cas/4.0.x/protocol/CAS-Protocol.html)

(0)在访问Protected App之后

https://app1.hoau.com:8413/cas1

如图,我们可以发现CAS服务器已经生成了CASTGC,这个值会再访问另一应用时使用到。

eyJhbGciOiJIUzUxMiJ9.ZXlKaGJHY2lPaUprYVhJaUxDSmxibU1pT2lKQk1USTRR
MEpETFVoVE1qVTJJbjAuLndBeWRVeGpIODE4Z0I4X29DSFBXYXcuVHVaOE5BN0tQZ
GJlSU5NSUZjNGZSQUVacDdUeGFFQkNJU2FONVFEYVRrVUpYR3VyUlpDeEloTktxTF
ljci1jNGJVdjdQLWc5MW9uaEUtU0VNSHV4RUU4dGpMeDRtMkg0RGNWbFJyTkJiR0N
EOUljSzNNZFZjV1BCRDduSFpwZ3E5VmI1emJMRV9GSmJjY1ZwZU5QdXRhOEp0M1g4
b0NLVjQzanozeHA1WlRfR0xkdjdmdjZlMmtEMnBTRXRIOG5UcS04NFpmNFlEcGZ4c
1Z2WDhlMVZLb0ZRcndyWUJpdGpnU0c4TkxPVHB5dy5TQURjZmN2cGhnbkJJT0NKNl
RLd1pB.hsIsZNJHWfrqQJ3kj4z18WctFpxeVPDQv9ONeK4yRVRSNBNprlfYJ_toa9
hbNozf_rGYOYySEdMJbSvR5IMa-A

(1)访问另一应用

https://app2.hoau.com:8423/cas2

这时

(2)Protected App #2无法对用户进行认证

服务器返回重定向状态码“302 Found”,将浏览器重定向到CAS服务器

Location:"https://sso.hoau.com:8433/cas/login?service=https%3A%2F%2Fapp2.hoau.com%3A8423%2Fcas2"    

(3)浏览器尝试访问CAS服务器

并携带当前的Session和场景一中通过App #1认证时获取的Cookie CASTGC

https://sso.hoau.com:8433/cas/login?service=https://app2.hoau.com:8423/cas2

(4)CAS服务器验证Ticket并重定向

由于CAS服务器仍然存有之前CASTGC的状态,因此将浏览器再次重定向到应用#2

Location:"https://app2.hoau.com:8423/cas2?
ticket=ST-58-TilmxEy20VOmDQuSdIx1-cas01.sso.hoau.com"

(5)浏览器通过重定向访问应用#2的地址

https://app2.hoau.com:8423/cas2

然后

(6)Protected App #2会向CAS服务器再次发起请求

此时会携带Protected App #2生成的ticket

ticket=ST-58-TilmxEy20VOmDQuSdIx1-cas01.sso.hoau.com

(7)如果验证成功,CAS服务器会返回包含成功信息的xml内容相应

并且将浏览器重定向到Protected App #2的登陆后页面

* 此处(6)、(7)两步使用TCPMon接获消息查看,由于测试时忘记配TCPMon了,可能某些参数值对不上,在此致歉

(8)Protected App #2的验证通过后,尝试重定向到登陆成功的页面

(9)浏览器携带CAS的Cookie请求App #2的登陆成功页

Protected App #2再次校验Session Cookie

(10)如果验证成功,则返回登陆成功页面的内容

结束

(转)CAS (4) —— CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example)的更多相关文章

  1. CAS (4) —— CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example)

    CAS (4) -- CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example) tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0 ...

  2. CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解

    CAS (6) -- Nginx代理模式下浏览器访问CAS服务器网络顺序图详解 tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 nginx版本: nginx-1. ...

  3. sso单点登录原理详解

    sso单点登录原理详解     01 单系统登录机制    1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务 ...

  4. css3浏览器私有属性前缀使用详解

    什么是浏览器私有属性前缀 CSS3的浏览器私有属性前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分. 以下是几种常用前缀 -webkit- -moz- -m ...

  5. 【转】RocketMQ事务消费和顺序消费详解

    RocketMQ事务消费和顺序消费详解 转载说明:该文章纯转载,若有侵权或给原作者造成不便望告知,仅供学习参考. 一.RocketMq有3中消息类型 1.普通消费 2. 顺序消费 3.事务消费 顺序消 ...

  6. 输入url后浏览器干了些什么(详解)

    输入url后浏览器干了些什么(详解) DNS(Domain Name System, 域名系统) 解析 DNS解析的过程就是寻找哪台机器上有你真正需要的资源过程.但你在浏览器张红输入一个地址时,例如: ...

  7. “全栈2019”Java第九十八章:局部内部类访问作用域成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第七十一章:外部类访问静态内部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第六十八章:外部类访问内部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Android 用adb pull或push 拷贝手机文件到到电脑上,拷贝手机数据库到电脑上,拷贝电脑数据库到手机上

    先说一下adb命令配置,如果遇到adb不是内部或外部命令,也不是可运行的程序或批量文件.配置下环境变量 1.adb不是内部或外部命令,也不是可运行的程序或批量文件. 解决办法:在我的电脑-属性-高级计 ...

  2. loadrunner关联数组后拼凑字符串

    loadrunner拼接关联数组的元素 int arrSize=0; int index=1; int len=0; char arryStartString[1024]=""; ...

  3. [转]关于int整形变量占有字节问题

    int的长度由处理器(16位,32位,64位)和比哪一期决定. 首先从处理器来讲 :16位处理器中的int 占有16位 即2个字节                         32位处理器中int ...

  4. Regionals 2012 :: HangZhou

    题目传送门排行榜 一个人做了12年北大出的题,自己还是太弱了,图论的知识忘光光,最小生成树裸题写不来,Dijkstra TLE不知道用SPFA. 简单几何(点到线段的距离) + 三分 B Steali ...

  5. Count the string[HDU3336]

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. BZOJ4361 : isn

    设$f[i]$表示长度为$i$的不下降子序列的个数. 考虑容斥,对于长度为$i$的子序列,如果操作不合法,那么之前一定是一个长度为$i+1$的子序列,所以答案$=\sum_{i=1}^n(f[i]\t ...

  7. CentOS 多网卡绑定bonding

    1.查看环境 ip a |grep -v lo 2.加载bonding模块 modprobe bonding 3.开机自动加载模块到内核 echo 'modprobe bonding &> ...

  8. 【UR #4】元旦三侠的游戏(博弈论+记忆化)

    http://uoj.ac/contest/6/problem/51 题意:给m($m \le 10^5$)个询问,每次给出$a, b(a^b \le n, n \le 10^9)$,对于每一组$a, ...

  9. 【wikioi】1018 单词接龙

    题目链接 算法:DFS+考你阅题 题目描述: 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中 ...

  10. 小结:kmp

    复杂度: O(len(a)+len(b)) 技巧及注意: 在匹配的时候记住先要自身匹配然后再匹配即可,同时边界问题不能忽略,处理好点吧. #include <cstdio> #includ ...