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定义了三个规范来完成撤销认证这个动作:

  1. Session Management :可选。Session管理,用于规范OIDC服务如何管理Session信息。
  2. Front-Channel Logout:可选。基于前端的注销机制。
  3. 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这一部分中重点有两个信息:

  1. RP退出登录的URL地址(这个在RP注册的时候会提供给OIDC服务);
  2. 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】之登出的更多相关文章

  1. IdentityServer4之SSO(基于OAuth2.0、OIDC)单点登录、登出

    IdentityServer4之SSO(基于OAuth2.0.OIDC)单点登录.登出 准备  五个Web站点: 1.localhost:5000 :                  认证服务器.2 ...

  2. cas单点登出

    由于项目需求要实现单点登出需要在网上找了N久终于实现单点登出. 使用cas-server-core-3.3.3.jar(CAS Server 3.3.3) 使用cas-client-core-3.1. ...

  3. 从零搭建一个IdentityServer——会话管理与登出

    在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...

  4. [Django]登陆界面以及用户登入登出权限

    前言:简单的登陆界面展现,以及用户登陆登出,最后用户权限的问题 正文: 首先需要在settings.py设置ROOT_URLCONF,默认值为: ROOT_URLCONF  = 'www.urls'# ...

  5. phpCAS::handleLogoutRequests()关于java端项目登出而php端项目检测不到的测试

    首先,假如你有做过cas,再假如你的cas里面有php项目,这个时候要让php项目拥有cas的sso功能,你需要改造你的项目,由于各人的项目不同,但是原理差不多,都是通过从cas服务器获取sessio ...

  6. 源代码解读Cas实现单点登出(single sign out)功能实现原理

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  7. cas sso单点登录系列6_cas单点登录防止登出退出后刷新后退ticket失效报500错

    转(http://blog.csdn.net/ae6623/article/details/9494601) 问题: 我登录了client2,又登录了client3,现在我把client2退出了,在c ...

  8. 源代码解读Cas实现单点登出(single sign out)功能实现原理--转

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  9. 单点登录CAS使用记(六):单点登出、单点注销

    单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...

随机推荐

  1. Git&GitHub语法大全

    目录 1. GitHub与Git万用语法 1)创建库 2)添加和提交到仓库 3)版本回退 4)缓存区和暂存区 5)撤销和删除文件 6)远程仓库 7)创建和合并分支 2. 更多Git语法 1. GitH ...

  2. 【夯实PHP基础】PHP多进程-- pcntl_fork实现

    本文地址 参考文档 分享提纲: 1. 概述 2.安装(只支持Linux) 3. 代码实验多进程pcntl_fork 4. 具体解释 1. 概述 PHP有个pcntl_fork的函数可以实现多进程,但要 ...

  3. linux编译64bitHadoop (eg: ubuntu14.04 and hadoop 2.3.0)

    Hadoop官网提供的编译好的hadoop-2.3.0.tar.gz二进制包是在32位系统上编译的,在64系统上运行会有一些错误,比如: WARN util.NativeCodeLoader: Una ...

  4. PostgreSQL 数据库NULL值的默认排序行为与查询、索引定义规范 - nulls first\last, asc\desc

    背景 在数据库中NULL值是指UNKNOWN的值,不存储任何值,在排序时,它排在有值的行前面还是后面通过语法来指定. 例如 -- 表示null排在有值行的前面 select * from tbl or ...

  5. 局域网下Android与scoket通信的实现

    因为最近实验室项目要求实现在局域网下将android app数据发送到winsock中进行保存,所以对此进行了简单学习.pc端因为是另一个同学做的,所以不做说明. 在android端,首先添加权限: ...

  6. java8中的接口与时间操作

    java8中接口可以有默认方法(用default修饰,可以有多个)和静态方法了. public interface Tran { default public String getName() { r ...

  7. [matlab] 6.粒子群优化算法

    粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早由Kennedy和Eberhart在19 ...

  8. Ubuntu下的 PPPoE 拨号上网方法

    1. 配置 pppoe $ sudo pppoeconf 2. 联网 $ sudo pon dsl-provider 3. 断网 $ sudo poff 4. 查看日志 $ plog 5. 查看接口信 ...

  9. windows下使用svn命令行

    1.安装“Slik-Subversion-1.9.7-win32.zip”,将路径写入windows的path路径 2.在cmd下可以执行svn 3.应为tortoiseSVN的版本比1的版本低,导致 ...

  10. Spring Security(二十):6.2.3 Form and Basic Login Options

    You might be wondering where the login form came from when you were prompted to log in, since we mad ...