IdentityServer Topics(7)- 注销
注销IdentityServer与删除身份cookie一样简单,但是我们必须考虑将用户从客户端应用程序(甚至可能是上游身份提供程序)中注销。
一.删除身份认证Cookie#
要删除身证认证cookie,只需在HttpContext
的扩展方法SignOutAsync
即可。你需要传递一个值IdentityServerConstants.DefaultCookieAuthenticationScheme
,如果你修改了他,那么使用你自定义的值。
await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
或者
await HttpContext.SignOutAsync();
通常,你应该提示用户注销(意思是需要POST方式提交注销请求),否则攻击者可能会热链接到你的注销页面(GET方式),导致用户被自动注销。
二.通知客户端已被注销的用户信息#
作为注销过程的一部分,你需要确保向客户端通知用户已注销。IdentityServer支持服务器应用程序(MVC Client)的 front-channel 和 back-channel,以及基于浏览器的JavaScript客户端(例如SPA,React,Angular等)的session management。
Front-channel#
要通过 Front-channel 从服务器端应用程序注销用户,IdentityServer中的“注销”页面必须呈现<iframe>
以通知客户端用户已注销。希望被通知的客户端必须设置 FrontChannelLogoutUri
的值。IdentityServer 跟踪用户登录的客户端,并在IIdentityServerInteractionService
上提供名为GetLogoutContextAsync
的API。该API返回一个带有SignOutIFrameUrl
属性的LogoutRequest
对象,所以你注销的页面必须呈现为\<iframe\>
。
Back-channel#
通过 Back-channel 来注销用户,IdentityServer中的SignOutIFrameUrl
端点将自动触发Server到Server的调用,将签名注销请求传递给客户端。这意味着即使没有 Front-channel ,IdentityServer中的“注销”页面仍然必须呈现一个<iframe>到SignOutFrameUrl
,希望收到通知的客户端必须设置BackChannelLogoutUri
配置值
基于浏览器的JavaScript客户端#
参考 session management 的设计规范,IdentityServer中没有什么特别的,您需要通知这些客户端用户已经退出。 但是,客户端必须对check_session_iframe
执行监视,并且这由 oidc-client JavaScript库实现。
三.由客户端应用程序发起的注销#
如果注销是由客户端应用程序启动的,则客户端首先将用户重定向到最终会话端点。 在会话结束端点进行处理可能需要通过重定向到注销页面来维护一些临时状态(例如,客户端的注销,注销重定向uri)。 该状态可能对注销页面有用,并且状态的标识符通过logoutId参数传递到注销页面。
交互服务上的GetLogoutContextAsync
API可用于加载状态。感兴趣的是ShowSignoutPrompt
,它指示注销请求是否已通过身份验证,因此不会提示用户注销。
默认情况下,此状态作为通过logoutId
值传递的受保护数据结构进行管理。 如果你希望在会话终端和注销页面之间使用其他持久性,则可以实现IMessageStore <LogoutMessage>
并在DI中注册实现。
作者:晓晨Master(李志强)
出处:https://www.cnblogs.com/stulzq/p/8570695.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
目前学习.NET Core 最好的教程 .NET Core 官方教程 ASP.NET Core 官方教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!