第24章 退出
注销identityserver就像删除身份验证cookie一样简单,但是为了完成联合注销,我们必须考虑将用户从客户端应用程序(甚至可能是上游身份提供者)中签名。
24.1 删除认证
要删除身份验证cookie,只需使用httpcontext
扩展方法signoutasync
即可。您需要传递使用的方案(identityserverconstants.defaultcookieauthenticationscheme
除非您已更改,否则提供此方案):
await httpcontext.signoutasync(identityserverconstants.defaultcookieauthenticationscheme);
或者您可以使用identityserver提供的便捷扩展方法:
await httpcontext.signoutasync();
注意
通常,您应该提示用户注销(需要post),否则攻击者可能会链接到您的注销页面,导致用户自动注销。
24.2 通知客户端用户已注销
作为退出流程的一部分,您需要确保客户端应用程序被告知用户已退出。identityserver支持服务器端客户端的规范(例如mvc),服务器端客户端的 规范(例如mvc),以及基于浏览器的javascript客户端的规范(例如spa,react,angular)等)。
24.2.1 前端服务器端客户端
要通过前端通道规范从服务器端注销客户端应用程序用户,identityserver中的“已注销”页面必须呈现<iframe>
以通知客户端用户已注销。希望收到通知的客户端必须设置frontchannellogouturi
配置值。identityserver跟踪用户已登录的客户端,并提供在iidentityserverinteractionservice
上(详细信息)调用getlogoutcontextasync
的api 。此api返回一个logoutrequest
对象,该对象具有signoutiframeurl
注销您的页面必须呈现为的<iframe>
属性。
24.2.2 反向通道服务器端客户端
要通过反向通道规范从服务器端注销客户端应用程序用户,identityserver中的signoutiframeurl
端点将自动触发服务器到服务器调用,将签名的注销请求传递给客户端。这意味着即使如果没有前面通道的客户端中,“退出”,在identityserver页仍必须渲染<iframe>
到signoutiframeurl
如上所述。希望收到通知的客户端必须设置backchannellogouturi
配置值。
24.2.3 基于浏览器的javascript客户端
鉴于规范的设计方式,identityserver中没有什么特别的,您需要做的是通知这些客户端用户已注销。但是,客户端必须对check_session_iframe执行监视,这是由oidc-client javascript库实现的。
24.3 由客户端应用程序启动的注销
如果客户端应用程序启动了注销,则客户端首先将用户重定向到结束会话端点。在结束会话端点处的处理可能需要通过重定向到注销页面来维护一些临时状态(例如,客户端的注销后重定向uri)。此状态可能对注销页面有用,并且状态的标识符通过logoutid参数传递到注销页面。
在getlogoutcontextasync
上的api 交互服务可以用来加载状态。感兴趣的showsignoutprompt
是showsignoutprompt
指示注销请求是否已经过身份验证,因此不会提示用户注销是安全的。
默认情况下,此状态作为通过logoutid值传递的受保护数据结构进行管理。如果您希望在结束会话端点和注销页面之间使用其他一些持久性,那么您可以imessagestore<logoutmessage>
在di中实现并注册实现。
github地址