IdentityServer4【Topic】之登出
Sign-out 登出
IdentityServer的登出就像删除认证cookie一样简单,但是为了完成一个完整的联合签名,我们必须考虑将用户从客户端应用程序中(甚至可能是上游的Identity提供者)登出。
Removing the authentication cookie删除认证cookie
简单的调用HttpContext的SignOutAsync方法就能删除认证cookie,要使用该方法,你需要传递那个使用的认证方案(scheme,默认情况下是IdentityServerConstants.DefaultCookieAuthenticationScheme,除非你更改过它):
await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
或者你也可以使用IdentityServer提供的这个更为便利的扩展方法:
await HttpContext.SignOutAsync();
通常情况下,应该提示用户登出(意味着需要一个POST),否则攻击者可以将其链接到您的注销页面,从而导致用户自动注销。
Notifying clients that the user has signed-out通知客户端用户已经登出
作为signout这个整体动作的一部分,应该确保客户端应用程序也得到了用户登出的信息,对于有服务端的客户端,IdentityServer提供了对front-channel规范的支持;对于基于浏览器的javascript客户端(例如SPA、React、Angular等),IdentitySever提供了对 session management 规范的支持。
实际上,OIDC定义了三个规范来完成撤销认证这个动作:
- Session Management :可选。Session管理,用于规范OIDC服务如何管理Session信息。
- Front-Channel Logout:可选。基于前端的注销机制。
- Back-Channel Logout:可选。基于后端的注销机制。
其中Session Management是OIDC服务自身管理会话的机制;Back-Channel Logout则是定义在纯后端服务之间的一种注销机制,应用场景不多,这里也不详细解释了。这里重点关注一下Front-Channel Logout这个规范(http://openid.net/specs/openid-connect-frontchannel-1_0.html),它的使用最为广泛,其工作的具体的流程如下(结合Session Management规范):

(上图来自:https://www.cnblogs.com/linianhui/p/openid-connect-extension.html)
在上图中的2和3属于session management这个规范的一部。其中第2步中,odic的退出登录的地址是通过Discovery服务中返回的end_session_endpoint字段提供的RP的。其中还有一个check_session_iframe字段则是供纯前端的js应用来检查oidc的登录状态用的。

4567这四步则是属于front-channel logout规范的一部分,OIDC服务的支持情况在Discovery服务中也有对应的字段描述:

4567这一部分中重点有两个信息:
- RP退出登录的URL地址(这个在RP注册的时候会提供给OIDC服务);
- URL中的sessionid这个参数,这个参数一般是会包含在idtoken中给到OIDC客户端,或者在认证完成的时候以一个独立的sessionid的参数给到OIDC客户端,通常来讲都是会直接把它包含在IDToken中以防止被篡改。
Front-channel server-side clients
在front-channel规范中,为了从带有服务端的client上登出用户,identityserver上面的登出页面必须渲染一个<iframe>来通知client客户已经登出。希望被通知的客户端必须设置了FrontChannelLogoutUri 这个配置。IdentityServer跟踪用户登入的那个客户端,并且在IIdentityServerInteractionService (查看详情)上面提供了一个GetLogoutContextAsync 的API,这个API返回一个LogoutRequest对象,它带有一个SignOutIFrameUrl属性,你的登出页面必须呈现为<iframe>(原文是:This API returns a LogoutRequest object with a SignOutIFrameUrl property that your logged out page must render into an <iframe>.我这个翻译很拗口,不知道翻译的对不对,请指正)
Back-channel server-side clients
要通过back-channel规范从服务器端客户端应用程序中签出用户,identityserver中的SignOutIFrameUrl端点将自动触发服务器到服务器的调用,将签名的签出请求传递给客户端。这意味着,即使没front-channel客户端,身份服务器中的“注销”页面仍然必须呈现如上所述的SignOutIFrameUrl。希望被通知的客户端必须有BackChannelLogoutUri配置值集。
Browser-based JavaScript clients
考虑到 session management 规范的设计方式,在identityserver中没有什么特别的东西,需要做的是通知这些客户已经登出。但是,客户端必须在check_session_iframe上执行监控,这是由oidc-client JavaScript library.实现的。
Sign-out initiated by a client application客户端应用发起的登出请求
如果一个登出请求是被客户端应用发起的,那么客户端首先会把用户重定向到end session endpoint。在处理从end session endpoint通过重定向到登出页面这件事可能需要保持一些临时的状态(state)(比如客户端登出的重定向uri)。这个状态或许对于登出页面是有用的,并且state的标志符( the identifier for the state)也通过一个logoutid的参数传递给了logout页面。
interaction service 上面的GetLogoutContextAsync API可以用来加载这个state。返回的LogoutRequest对象上的ShowSignoutPrompt属性指示签出的请求是否已认证过,并且因此它不提示用户签出是安全的。
默认情况下这个state是通过logoutid的值作为一个被保护的数据结构来管理的,通过实现IMessageStore<LogoutMessage>并将其注册到DI,可以在end session endpoint和登出页面之间对这个值做一些持久化的工作。
IdentityServer4【Topic】之登出的更多相关文章
- IdentityServer4之SSO(基于OAuth2.0、OIDC)单点登录、登出
IdentityServer4之SSO(基于OAuth2.0.OIDC)单点登录.登出 准备 五个Web站点: 1.localhost:5000 : 认证服务器.2 ...
- cas单点登出
由于项目需求要实现单点登出需要在网上找了N久终于实现单点登出. 使用cas-server-core-3.3.3.jar(CAS Server 3.3.3) 使用cas-client-core-3.1. ...
- 从零搭建一个IdentityServer——会话管理与登出
在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...
- [Django]登陆界面以及用户登入登出权限
前言:简单的登陆界面展现,以及用户登陆登出,最后用户权限的问题 正文: 首先需要在settings.py设置ROOT_URLCONF,默认值为: ROOT_URLCONF = 'www.urls'# ...
- phpCAS::handleLogoutRequests()关于java端项目登出而php端项目检测不到的测试
首先,假如你有做过cas,再假如你的cas里面有php项目,这个时候要让php项目拥有cas的sso功能,你需要改造你的项目,由于各人的项目不同,但是原理差不多,都是通过从cas服务器获取sessio ...
- 源代码解读Cas实现单点登出(single sign out)功能实现原理
关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...
- cas sso单点登录系列6_cas单点登录防止登出退出后刷新后退ticket失效报500错
转(http://blog.csdn.net/ae6623/article/details/9494601) 问题: 我登录了client2,又登录了client3,现在我把client2退出了,在c ...
- 源代码解读Cas实现单点登出(single sign out)功能实现原理--转
关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...
- 单点登录CAS使用记(六):单点登出、单点注销
单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...
随机推荐
- if else; while; break;continue ----流程控制系列
第一种语法: if 条件: # @引号是为了把条件和结果分开. 结果1 # 一个Tab或者4个空格 @告诉程序满足上面的if条件才会执行结果1结果2 #如果条件为真(True),执行结果1,然后执行结 ...
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...
- dp 动态规划 蘑菇
蘑菇真的贵,友情价更高 Description 由于提莫为巡逻准备的蘑菇太多了,多余的蘑菇路上种不下,于是他精心挑选了一些蘑菇拜访他的好朋友小炮 提莫的蘑菇一共有n个,对于编号为i的蘑菇魔力值是a ...
- UVA140-Bandwidth(搜索剪枝)
Problem UVA140-Bandwidth Time Limit: 3000 mSec Problem Description Given a graph (V, E) where V is ...
- 解决 双显卡 y7000笔记本 (Dual Graphics) Ubuntu 18.04 GDM3 无法外接显示器
sudo gedit /lib/systemd/system/gdm3.service 把其中的 ExecStartPre=/usr/share/gdm/generate-config 更改为 Exe ...
- Python 属性与方法 概念理解
属性与方法 attribute(属性)是class(类)中的成员变量,而method(方法)则是class(类)中的function(函数). 也可以理解,属性就类变量,方法就是类函数. 类中的变量就 ...
- icon图标库记录
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 阿里巴巴: http://iconfont.cn/ 可以下载图标 github : x ...
- P2690 接苹果 (DP)
补一下dp的思路: dp[i][j]表示第 i 分钟转 j 次所得到的最大值.很容易得到这个dp的推导式. 图中¢()函数表示成立为1, 不成立为0的函数. #include<cmath> ...
- pycharm 安装及使用
pycharm 的使用: IDE 集成开发环境(Integrated Development Environment) VIM 经典的Linux下的文本编辑器 EMACS: Linux文本编辑器,比v ...
- Oracle查询数据库中所有表的记录数
1.Oracle查询数据库中所有表的记录数,但是有可能不准建议用第二种方式进行查询 select t.table_name,t.num_rows from user_tables t 2.创建orac ...