CAS单点登录(十一)——单点退出
在前面我们讲解了CAS的单点登录客户端接入,对于CAS的登录有了更清楚的了解,今天我们讲解一下在CAS中的单点退出问题。
首先我们要明白单点退出(单点注销)与注销的区别:
其实官方文档也给我们详细的解释了:
注销:
应用程序注销 - 结束单个应用程序会话CAS注销 - 结束CAS SSO会话
请注意,在简单的情况下,每种情况下的注销操作对另一种情况都没有影响。
而单点注销(SLO):
当CAS配置为SLO时,它会尝试向SSO会话期间请求对CAS进行身份验证的每个应用程序发送注销消息。CAS旨在支持单点注销:这意味着除了自己的SSO会话之外,它还能够使客户端应用程序会话无效。
对应CAS单点退出的流程原理可以查看CAS单点登录(一)——初识SSO当时在文章中也有讲解。
同样的我们再来分析一下具体的流程:
- 用户向系统1发起注销请求
- 系统1根据用户与系统1建立的会话id拿到令牌,向SSO认证中心发起注销请求
- SSO认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
- SSO认证中心向所有注册系统发起注销请求
- 各注册系统接收SSO认证中心的注销请求,销毁局部会话
- SSO认证中心引导用户至登录页面
第5条中就详细分析了,当多个系统接入到CAS中时,单点退出时各注册系统接收SSO认证中心的注销请求,销毁局部会话。
默认CAS单点退出(单点注销)是开启的,我们可以手动配置关闭或启用。
##
# Single Logout配置
#
cas.slo.disabled=false
cas.slo.asynchronous=true
CAS单点注销主要支持下面两种方式:
1、Back Channel
CAS服务端直接向各服务客户端发送HTTP POST消息。这是向服务执行通知的传统方式。
2、Front Channel
CAS 通过一个异步的AJAX方式的GET请求,通过JSONP去验证各客户端服务,来使得各客户端的session无效。
注意:该方式不一定适用所有客户端,必须要确保客户端支持该方式。
CAS单点注销请求默认是在后台通过logoutType的属性配置好了的,默认为LogoutType.BACK_CHANNEL。
单个服务配置单点注销:
使用CAS注册的应用程序可以选择通过服务管理组件单独控制单个注销行为。服务注册表中的每个注册服务都将包含描述如何提交注销请求的配置。此行为通过logoutType属性进行控制,该属性允许指定是应通过后/前通道提交注销请求还是为此应用程序关闭注销请求。关闭注销请求可以将logoutType设置为NONE。
{"@class" : "org.apereo.cas.services.RegexRegisteredService","serviceId" : "^(https|imaps|http)://.*","name" : "web","id" : 10000001,"evaluationOrder" : 10,"accessStrategy" : {"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy","enabled" : true,"ssoEnabled" : true},"attributeReleasePolicy": {"@class": "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"},"theme": "anumbrella","logoutType" : "BACK_CHANNEL"
}
注销请求的请求路径配置,我们可以为每个服务配置请求路径,这样实现了更大的灵活性。
{"@class" : "org.apereo.cas.services.RegexRegisteredService","serviceId" : "^(https|imaps|http)://.*","name" : "web","id" : 10000001,"evaluationOrder" : 10,"accessStrategy" : {"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy","enabled" : true,"ssoEnabled" : true},"attributeReleasePolicy": {"@class": "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"},"theme": "anumbrella","logoutType" : "BACK_CHANNEL","logoutUrl" : "https://client.anumbrella.net/logout"
}
我们依然使用前面的client-demo来讲解CAS单点注销,注意:在CAS 5.3.x版本退出加上service参数,不会自动跳转,需要在application.properties中配置一下。
##
# Logout配置
#
cas.logout.followServiceRedirects=true
我们client-demo的控制器中添加service参数测试:
@GetMapping("/logout")public String logout(HttpSession session){session.removeAttribute(WebSecurityConfig.SESSION_KEY);return "redirect:https://sso.anumbrella.net:8443/cas/logout?service=https://client.anumbrella.net:9443/";}
当我们主动退出后,自动跳转到登录页面。
我们启动一个CAS客户端服务cas-management,在里面可以查看到CAS退出的相关配置。
这里我们将logoutUrl设置为http://172.16.67.230:8000/logout
,具体地址为我本机调试IP,通过MAC终端调试工具 nc netcat来监听端口8000,服务端发送给我们的被动退出请求,方法为POST。
sudo nc -l 0.0.0.0 8000
当然还可以使用Wireshark来捕获服务端发送给我们请求,注意:Wireshark抓取数据包的时候发现只能抓取别的机器上的数据包,如果是本机的服务则发现好像抓不到。需要进行一定的配置才行,所以这里我使用的是nc netcat 工具。
目前我们启动了两个客户端,一个服务端。我们点击client-demo注销。
在服务端日志中我们发现,发送了2次请求。
在命令端我们接收到服务端的POST请求。
然后我们便可以根据logoutRequst请求的参数中去销毁各个服务端的session,一般情况是session的键值对,键为st票据,拿到键我们就能删除具体的session。当然不同的客户端接入情况不一样,具体看保存session时是如何做的。
比如上面的logoutRequst的数据形式如下:我们拿到的就是ST-21-qK6bcCxu4iJZBBGtG0MtsNsgJ40anumbrelladeiMac
。
<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="LR-20-gJ8SYdbM4Ycm-xG3Dve-p3qA" Version="2.0" IssueInstant="2019-04-07T15:40:02Z"><saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">@NOT_USED@</saml:NameID><samlp:SessionIndex>ST-21-qK6bcCxu4iJZBBGtG0MtsNsgJ40anumbrelladeiMac</samlp:SessionIndex>
</samlp:LogoutRequest>
这里我只是简单演示了一下退出服务端发送的请求,如果我们CAS系统接入很多客户端,具体客户端在不同的地址,我们就可以配置自己相应的logoutUrl,然后在被动退出时在POST监听地址中销毁掉session即可。
代码实例:Chapter10
参考
- https://apereo.github.io/cas/5.3.x/installation/Logout-Single-Signout.html
- https://apereo.github.io/cas/5.3.x/protocol/CAS-Protocol-Specification.html
CAS单点登录(十一)——单点退出相关推荐
- 什么是单点登录,单点登录的三种实现方式
转载地址:https://www.jianshu.com/p/613e44d4a464 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在 ...
- 啥是单点登录及单点登录原理
一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关 ...
- 什么是单点登录?单点登录的三种实现方式
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...
- cas java单点登录_java单点登录系统CAS的简单使用
http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...
- jwt单点登录_单点登录SSO技术选型
一些人存在的意义总归是让另一些人成长,然后消失. --刘同<谁的青春不迷茫> 1.单点登录是什么? 单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这 ...
- 什么是单点登录?单点登录的解决方案
什么是单点登录? 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便. 但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系 ...
- 单点登录(4):单点登录实现(附源码)
1.修改host实现跨域的单点登录 由于需要演示跨域,需要先进行域名设置.不会的先看我的另一篇文章mac配置自定义域名:设置如下: 127.0.0.1 www.sso.com 127.0.0.1 ww ...
- php discuz 单点登录,有关单点登陆的课程推荐10篇
摘要:本文主要介绍了利用webservice,session,cookie技术,来进行通用的单点登录系统的分析与设计.具体实现语言为PHP.单点 登录,英文名为Single Sign On,简称为 S ...
- php跨域单点登录,SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析...
SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1. 跨域redirect实例: te ...
最新文章
- 如何查找基因在发表研究中的表达
- php线程视频教程,通俗易懂的php多线程解决方案
- python答辩结束语_2018-08-17 结束答辩
- Windows 编译cython nms
- jquery技巧总结 学习
- 综合布线管理系统之智能配线架的过去与将来
- Intel Realsense 通过用户配置文件(profile)获取深度传感器(depth_sensor)超蛋疼的一幕 dir()
- OneAlert 入门(一)——事件流
- 并发服务器的信号传递,使服务器支持并发、GIL全局解释器锁、死锁和Rlock、信号量、event事件、...
- mysql存储过程 --游标的使用 取每行记录 (多字段)
- 中兴8912交换机show run故障处理
- ubuntu防火墙问题
- go语言项目实战1:-正则表达式,文件读取的综合使用
- 行人重识别论文阅读13-Parameter Sharing Exploration and Hetero-center Triplet Loss for Visible-Thermal Person
- 渲染科研入门到入土(Chinagraph2020闫令琪老师分享)
- 缺失值处理(Imputation)
- JavaScript程序库jQuery学习笔记分享(二)jQuery对象和DOM操作,和其他js库冲突处理
- php.ini error reporting,解决PHP.ini中的error_reporting不起作用
- 安装office提示Office 16 Click-to-Run Extensibility Component
- python将图像变成没有颜色_python将图片设置背景颜色修改为透明色