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

通知客户端用户已注销

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

前端服务器端客户端

要通过前端通道规范从服务器端客户端应用程序注销用户,IdentityServer中的“已注销”页面必须呈现<iframe>以通知客户端用户已注销。希望收到通知的客户端必须FrontChannelLogoutUri设置配置值。IdentityServer跟踪用户已登录的客户端,并提供GetLogoutContextAsyncIIdentityServerInteractionService详细信息调用的API 此API返回一个LogoutRequest对象,对象具有SignOutIFrameUrl您已注销的页面必须呈现为的属性<iframe>

反向通道服务器端客户端

要通过反向通道规范从服务器端客户端应用程序注销用户SignOutIFrameUrl,IdentityServer中端点将自动触发服务器到服务器调用,将签名的注销请求传递给客户端。这意味着即使如果没有前面通道的客户端中,“退出”,在IdentityServer页仍必须渲染<iframe>SignOutIFrameUrl如上所述。希望收到通知的客户端必须BackChannelLogoutUri设置配置值。

基于浏览器的JavaScript客户端

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

由客户端应用程序启动的注销

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

GetLogoutContextAsync上的API 交互服务可以用来加载状态。感兴趣的ShowSignoutPromptShowSignoutPrompt指示注销请求是否已经过身份验证,因此不会提示用户注销是安全的。

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