IdentityServer4注销

时间:2018-03-05 15:24:42

标签: .net identityserver4 asp.net-authentication

我遇到一个问题,我似乎无法让我的Identity Server注销首先显示确认。我从github下载了IdentityServer4的源代码,并在Models文件夹中找到了该参数:LogoutRequest.cs,ShowSignOutPrompt。除了在注销期间检查它外,IdentityServer中没有对它的引用。

在调试中,我发现它是错误的。我不知道应该在哪里设置,我已经检查了服务器端和客户端端的客户端配置选项,以及服务器启动时的选项。

我找不到" ShowSignoutPrompt"在客户端代码中(我目前使用IdentityServer3 Owin Hybrid客户端示例)。

这是代码流程: 我们的默认布局中有一个按钮,用于触发客户端的AccountController.Signout():

public void Signout()
{
    Request.GetOwinContext().Authentication.SignOut();
}

从那里开始,我并不完全确定如何,但它下次点击的是IdentityServer的AccountController.Logout(string logoutId)。该方法构建注销提示视图(使用AccountServices.BuildLogoutViewModelAsync中的检查)并将其返回给用户的浏览器。如果PostLogoutRedirectUri设置为" / signout-callback-oidc",唯一正确的方法是不将ShowSignoutPrompt设置为false。我不知道为什么。

当用户点击"是"在上面生成的视图中,它转到IdSrvr的AccountController.Logout(LogoutInputModel模型)。我试图改变该方法的最后一行:

return View("LoggedOut", vm);

为:

return Redirect(vm.PostLogoutRedirectUri);

这里的另一个问题是,PostRedirectUri在这里为空,即使我在客户端配置上设置它(好吧,就此而言,Identity Server的客户端配置也有它)。

2 个答案:

答案 0 :(得分:3)

没有客户端属性来控制它。

注销客户端应用程序时,请调用IdentityServer4 End Session Endpoint

当客户端发送原始id_token时,可以绕过注销提示。 这是作为id_token_hint参数传递的。

此外,它还表明注销请求是否已经过身份验证,因此不会提示用户注销是安全的。 的 per ref

ShowSignoutPrompt 指示是否应根据传递到结束会话端点的参数提示用户注销。 来源PDF

注意: 如果您使用的是JavaScript OIDC-Client-JS库,那么'signoutRedirect'方法将在内部检查,请参阅_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,则可以使用新类ClientProperty来存储键值对。在这里,您可以创建一个“LogoffPromptRequired”键和一个值“true”,用于客户端或IdentityServer实现,以确定是否需要Logg off屏幕。

答案 1 :(得分:0)

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