我遇到一个问题,我似乎无法让我的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的客户端配置也有它)。
答案 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。