IdentityServer4注销
IdentityServer4 logout
我遇到了一个问题,我似乎无法让我的 Identity Server 注销先显示确认。我从github下载了IdentityServer4的源码,在Models文件夹中找到参数:LogoutRequest.cs,ShowSignOutPrompt。在 IdentityServer 中没有对它的引用,除非在注销期间检查它。
调试时发现是假的。我不知道应该在哪里设置,我已经检查了服务器端和客户端的客户端配置选项,以及服务器启动时的选项。
我在客户端代码中找不到 "ShowSignoutPrompt" 的实例(我目前使用的是 IdentityServer3 Owin 混合客户端示例)。
代码流程如下:
我们的默认布局中有一个按钮,可触发客户端的 AccountController.Signout():
public void Signout()
{
Request.GetOwinContext().Authentication.SignOut();
}
从那里开始,我不太确定如何,但下一点是 IdentityServer 的 AccountController.Logout(string logoutId)。该方法构建注销提示视图(使用 AccountServices.BuildLogoutViewModelAsync 中的检查)并将其 returns 发送到用户的浏览器。不将 ShowSignoutPrompt 设置为 false 的唯一正确方法是将 PostLogoutRedirectUri 设置为“/signout-callback-oidc”。不知道为什么。
当用户在上面生成的视图上单击 "yes" 时,它会转到 IdSrvr 的 AccountController.Logout(LogoutInputModel 模型)。我正在尝试更改该方法的最后一行:
return View("LoggedOut", vm);
至:
return Redirect(vm.PostLogoutRedirectUri);
这里还有另一个问题,这里的 PostRedirectUri 为空,即使我在客户端配置中设置了它(好吧,就此而言,Identity Server 的客户端配置也有它)。
没有客户端属性来控制它。
注销时客户端应用程序调用 IdentityServer4 End Session Endpoint。
当客户端发送原件时,可以绕过注销提示 id_token。
这是作为 id_token_hint 参数传入的。
此外,它指示 sign-out 的请求是否已通过身份验证,因此不提示用户输入 sign-out 是安全的。
per ref
ShowSignoutPrompt 指示是否应根据传递给结束会话端点的参数提示用户注销。
来源 PDF
注意:
如果您使用 JavaScript OIDC-Client-JS library, the 'signoutRedirect' method will internally check, see _signoutStart method 行 354,用于 id_token_hint 参数或用户 id_token。因此,如果您使用此库注销用户并想要强制注销屏幕,则必须清除 user.id_token.
来自 _signoutStart() 的示例部分
_signoutStart(args = {}, navigator, navigatorParams = {}) {
...
var id_token = args.id_token_hint || user && user.id_token;
if (id_token) {
Log.debug("Setting id_token into signout request");
args.id_token_hint = id_token;
}
...
}
更新:
如果您使用的是 IdentityServer4 版本 2.x,您可以使用新的 class ClientProperty 来存储 key-value 对。在这里,您可以创建一个 "LogoffPromptRequired" 的键和一个 "true" 的值,用于客户端或 IdentityServer 实现以确定是否需要退出屏幕。
我建议在客户端应用程序中实现提示,然后在完成时重定向到结束会话。
我遇到了一个问题,我似乎无法让我的 Identity Server 注销先显示确认。我从github下载了IdentityServer4的源码,在Models文件夹中找到参数:LogoutRequest.cs,ShowSignOutPrompt。在 IdentityServer 中没有对它的引用,除非在注销期间检查它。
调试时发现是假的。我不知道应该在哪里设置,我已经检查了服务器端和客户端的客户端配置选项,以及服务器启动时的选项。
我在客户端代码中找不到 "ShowSignoutPrompt" 的实例(我目前使用的是 IdentityServer3 Owin 混合客户端示例)。
代码流程如下: 我们的默认布局中有一个按钮,可触发客户端的 AccountController.Signout():
public void Signout()
{
Request.GetOwinContext().Authentication.SignOut();
}
从那里开始,我不太确定如何,但下一点是 IdentityServer 的 AccountController.Logout(string logoutId)。该方法构建注销提示视图(使用 AccountServices.BuildLogoutViewModelAsync 中的检查)并将其 returns 发送到用户的浏览器。不将 ShowSignoutPrompt 设置为 false 的唯一正确方法是将 PostLogoutRedirectUri 设置为“/signout-callback-oidc”。不知道为什么。
当用户在上面生成的视图上单击 "yes" 时,它会转到 IdSrvr 的 AccountController.Logout(LogoutInputModel 模型)。我正在尝试更改该方法的最后一行:
return View("LoggedOut", vm);
至:
return Redirect(vm.PostLogoutRedirectUri);
这里还有另一个问题,这里的 PostRedirectUri 为空,即使我在客户端配置中设置了它(好吧,就此而言,Identity Server 的客户端配置也有它)。
没有客户端属性来控制它。
注销时客户端应用程序调用 IdentityServer4 End Session Endpoint。
当客户端发送原件时,可以绕过注销提示 id_token。 这是作为 id_token_hint 参数传入的。
此外,它指示 sign-out 的请求是否已通过身份验证,因此不提示用户输入 sign-out 是安全的。 per ref
ShowSignoutPrompt 指示是否应根据传递给结束会话端点的参数提示用户注销。 来源 PDF
注意: 如果您使用 JavaScript OIDC-Client-JS library, the 'signoutRedirect' method will internally check, see _signoutStart method 行 354,用于 id_token_hint 参数或用户 id_token。因此,如果您使用此库注销用户并想要强制注销屏幕,则必须清除 user.id_token.
来自 _signoutStart() 的示例部分
_signoutStart(args = {}, navigator, navigatorParams = {}) {
...
var id_token = args.id_token_hint || user && user.id_token;
if (id_token) {
Log.debug("Setting id_token into signout request");
args.id_token_hint = id_token;
}
...
}
更新:
如果您使用的是 IdentityServer4 版本 2.x,您可以使用新的 class ClientProperty 来存储 key-value 对。在这里,您可以创建一个 "LogoffPromptRequired" 的键和一个 "true" 的值,用于客户端或 IdentityServer 实现以确定是否需要退出屏幕。
我建议在客户端应用程序中实现提示,然后在完成时重定向到结束会话。