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 实现以确定是否需要退出屏幕。

我建议在客户端应用程序中实现提示,然后在完成时重定向到结束会话。