我有一个问题,我似乎无法让我的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 回答
没有客户端属性来控制它 .
注销客户端应用程序时会调用IdentityServer4 End Session Endpoint .
当客户端发送原始id_token时,可以绕过注销提示 . 这是作为id_token_hint参数传入的 .
此外,它还表明注销请求是否已经过身份验证,因此不会提示用户注销是安全的 . per ref
ShowSignoutPrompt 指示是否应根据传递到结束会话 endpoints 的参数提示用户注销 . 来源PDF
NOTE :如果您使用的是JavaScript OIDC-Client-JS库,'signoutRedirect'方法将在内部检查,请参阅_signoutStart method第354行,了解id_token_hint参数或用户id_token . 因此,如果您使用此库来关闭用户并希望强制注销屏幕,则必须清除user.id_token .
_signoutStart()的示例部分
UPDATE:
如果您使用的是IdentityServer4版本2.x,则可以使用新类ClientProperty来存储键值对 . 在这里,您可以创建"LogoffPromptRequired"的键和"true"的值,以在客户端或IdentityServer实现中使用,以确定是否需要Logg off屏幕 .
我建议在客户端应用程序中实现提示,然后在完成后重定向到endsession .