IdentityServer Topics(7)- 注销

注销IdentityServer与删除身份cookie一样简单,但为了完成联合注销,我们必须考虑将用户从客户端应用程序(甚至可能是上游身份提供程序)中注销。

删除身份Cookie

要删除身证cookie,只需在HttpContext的扩展方法SignOutAsync即可。你需要传递一个值IdentityServerConstants.DefaultCookieAuthenticationScheme ,如果你修改了他,那么使用你自定义的值。

await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);

或者

await HttpContext.SignOutAsync();

通常,您应该提示用户注销(意思是需要POST方式提交注销请求),否则攻击者可能会热链接到您的注销页面(GET方式),导致用户被自动注销。

通知客户端已被注销的用户信息

作为注销过程的一部分,您需要确保向客户端应用程序通知用户已注销。IdentityServer支持服务器端的客户端(MVC Client)的前端通信规范,服务器端的客户端(MVC Client)的后端通信规范,以及基于浏览器的JavaScript客户端(例如SPA,React,Angular等)的会话管理规范。

前端通信

要通过前端通信规范从服务器端的客户端应用程序注销用户,IdentityServer中的“注销”页面必须呈现<iframe>以通知客户端用户已注销。希望被通知的客户端必须设置FrontChannelLogoutUri的值。IdentityServer跟踪用户登录的客户端,并在IIdentityServerInteractionService(详情)上提供名为GetLogoutContextAsync的API。该API返回一个带有SignOutIFrameUrl属性的LogoutRequest对象,所以你注销的页面必须呈现为<iframe>

后端通信

通过后端通信来注销用户,IdentityServer中的SignOutIFrameUrl端点将自动触发服务器到服务器的调用,将签名注销请求传递给客户端。这意味着即使没有前端客户端,IdentityServer中的“注销”页面仍然必须呈现一个<iframe>到SignOutFrameUrl,希望收到通知的客户端必须设置BackChannelLogoutUri配置值

基于浏览器的JavaScript客户端

鉴于会话管理规范是如何设计的,IdentityServer中没有什么特别的,您需要通知这些客户端用户已经退出。 但是,客户端必须对check_session_iframe执行监视,并且这由oidc-client JavaScript库实现。

由客户端应用程序发起的注销

如果注销是由客户端应用程序启动的,则客户端首先将用户重定向到最终会话端点。 在会话结束端点进行处理可能需要通过重定向到注销页面来维护一些临时状态(例如,客户端的注销,注销重定向uri)。 该状态可能对注销页面有用,并且状态的标识符通过logoutId参数传递到注销页面。

交互服务上的GetLogoutContextAsync API可用于加载状态。感兴趣的是ShowSignoutPrompt,它指示注销请求是否已通过身份验证,因此不会提示用户注销。

默认情况下,此状态作为通过logoutId值传递的受保护数据结构进行管理。 如果您希望在会话终端和注销页面之间使用其他持久性,则可以实现IMessageStore <LogoutMessage>并在DI中注册实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算

在Heroku上部署Node.js

今天,我们将演示如何在Heroku上部署Node.js应用。Heroku官方提供免费帐户使用,在此之上,我们最多可以托管5个应用程序。但如果你有大量需求的话,就...

4368
来自专栏小樱的经验随笔

Javac编译时出现包不存在的报错的解决方案

今天在学习包类调用时出现如下错误: ? packa包不存在,在C盘目录下应该有这个包啊 ? 原因是在当前目录下没找到,因为packa存放在其它目录下 如何解决:...

4096
来自专栏大数据-Hadoop、Spark

Unable to connect to zookeeper server within timeout: 6000

1.启动zookeeper 2.启动kafka 3.启动kafka-producer 4.启动kafka-consumer 5.生产一些消息 6.ka...

5166
来自专栏我的博客

Windows安装MinGW使用gcc和g++命令

MinGW 是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Wind...

93513
来自专栏一个会写诗的程序员的博客

adb命令 - adb forward交互流程adb命令 - adb forward交互流程

命令: adb forward tcp:6100 tcp:7100 // PC上所有6100端口通信数据将被重定向到手机端7100端口server上

2493
来自专栏腾讯云容器服务团队的专栏

使用腾讯云容器服务来构建简单web service

本文将介绍使用nginx和php来构建简单web service,核心在于如何配置nginx的upstream,使得nginx能够与后端服务通信。

1.6K10
来自专栏前端小叙

查看端口被占用的情况以及如何解除端口占用

在windows安装好nginx之后,打开nginx.exe失败,我想应该是80端口被占用了,遂找到此方法。 注:以下命令需要在管理员权限下运行 以下文章主要以...

3775
来自专栏计算机视觉

linux-Anaconda+conda创建python-pytorch虚拟环境

2472
来自专栏流柯技术学院

sublime text 3启动报错"swallow_startup_errors"解决方法

首选项 -- package settings -- Anaconda -- settings-user,

1403
来自专栏Golang语言社区

[Go 语言社区]Golang架构--服务器与客户端自定义传输规则--原创

对于写过架构的童鞋来说,自己封装传输规则也没有任何问题的,本文只是抛砖引玉,简单的说下我曾经和现在服务器使用的传输的规则,敬请看: 对于服务器...

3477

扫码关注云+社区

领取腾讯云代金券