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. 【转】RocketMQ事务消费和顺序消费详解

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

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

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

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

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

  7. SPI总线协议及SPI时序图详解

    SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

  8. SPI总线协议及SPI时序图详解【转】

    转自:https://www.cnblogs.com/adylee/p/5399742.html SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接 ...

  9. 十图详解tensorflow数据读取机制(附代码)转知乎

    十图详解tensorflow数据读取机制(附代码) - 何之源的文章 - 知乎 https://zhuanlan.zhihu.com/p/27238630

随机推荐

  1. 理解Lucene中的Query

    Query是一个接口,它有很多实现类. QueryParser是Query解析器,用于将一个字符串解析为一个Query对象,这个Query对象可能属于TermQuery,也可能属于PhraseQuer ...

  2. 你的Android不好用,都是因为这几点原因

    Android早已是全球最大.用户最多的移动操作系统,不过它离全球最好用还差得很远. 大家随手就能举出些曾经历过的糟心体验,如手机卡顿!电量不禁用!广告弹窗老是出现!不过很少有人会追根寻底的去问为何如 ...

  3. 当前上下文中不存在名称"Session"

    http://blog.csdn.net/muzai/article/details/8862902

  4. 消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数

    一.msgsnd 和 msgrcv 函数 #include <sys/types.h>   #include <sys/ipc.h>   #include <sys/ms ...

  5. spring 多线程

    http://blog.csdn.net/chszs/article/details/8219189 一.ThreadPoolTaskExecutor ThreadPoolTaskExecutor的配 ...

  6. [转]Windows 7自带很好用的磁盘检查与修复的环境

    大家可能都知道Windows 7自带很好用的检查与修复的环境.在启动系统前按F8(就是进入安全模式的方法),Windows 7会有一个修复计算机的选项.选择进入,装载一些必要的文件之后,选择语言.登陆 ...

  7. MySQL查看SQL语句执行效率(转)

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...

  8. spring mvc 依赖包

    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop&l ...

  9. QListWidget加入小控件

    在写一个简单的文件浏览器时,遇到一个问题.想实现新建目录时能像一般的文件管理器那样,目录图标以下有一个编辑框提示用户给目录命名(例如以下图),可是不知道怎么给单元项QListWidgetItem加入Q ...

  10. MYSQL加入远程用户或同意远程訪问三种方法

    加入远程用户admin密码为password GRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY \'password\' WIT ...