首页 文章

IdentityServer4注销

提问于
浏览
2

我有一个问题,我似乎无法让我的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

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

    注销客户端应用程序时会调用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()的示例部分

    _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;
        }
        ...
    }
    

    UPDATE:

    如果您使用的是IdentityServer4版本2.x,则可以使用新类ClientProperty来存储键值对 . 在这里,您可以创建"LogoffPromptRequired"的键和"true"的值,以在客户端或IdentityServer实现中使用,以确定是否需要Logg off屏幕 .

  • 3

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

相关问题