代码之家  ›  专栏  ›  技术社区  ›  Cloud

KeyClope注销未结束会话

  •  4
  • Cloud  · 技术社区  · 6 年前

    我正在使用Spring框架和Jetty 8.1以及Keyclope Jetty-81-Adapter 3.4的Java应用程序中使用Keyclope 3.4。

    根据keydrope文档,我应该能够在Java EE应用程序中使用HttpServletRequest从keydrope注销。然而,在我的情况下,这不起作用,即使Jetty支持HttpServletRequests。

    您可以通过多种方式注销web应用程序。对于Java EE servlet容器,可以调用HttpServletRequest。注销()。。

    如果我尝试以这种方式注销,我会被重定向到Keyclope(登录屏幕,可以选择多个领域登录)。然而,当我选择首选领域时,我会立即再次登录到webapplication,而无需提供任何凭据。

    我尝试了另一种方法,重定向到Keyclope:

    对于其他浏览器应用程序,可以将浏览器重定向到
    http://auth-server/auth/realms/ {领域名称}/协议/openid连接/注销?redirect\u uri=encodedRedirectUri

    但它在keybeave日志中抛出了一个连接拒绝错误,因为keybeave试图直接调用我的webapp。它对保持活动状态的KeyClope会话没有影响。我强烈希望不需要从keydrope直接调用webapp进行服务器端调用。

    有什么建议为什么 HttpServletRequest.logout() 在我的情况下,不会破坏keyclope会话吗? HttpServletRequest的Jetty实现是否与Java EE实现如此不同,以至于根本无法工作?

    3 回复  |  直到 6 年前
        1
  •  8
  •   Tobb    6 年前

    我在使用远程(OIDC)身份提供程序时也有过类似的经历。我发现 HttpServletRequest.logout 确实在中破坏了会话 Keycloak ,但未传播到远程身份提供程序的注销url。当转到远程登录站点时,它会立即将我重定向回来,因为我有一个活动会话。这看起来很像Keyclope会话实际上并没有失效,但我检查了一下,它确实失效了。使用浏览器重定向到url,在这两个位置都注销了。可能是个bug 钥匙斗篷

    你是否也面临同样的问题?要进行验证,请尝试注销,然后在Keyclope中选择您的客户端并列出会话,以查看它是否仍存在于Keyclope中。

        2
  •  3
  •   Eshlone Sythe    4 年前

    如果从未受保护的页面(未检查有效令牌的页面)执行方法(注销),刷新令牌可能不可用,在这种情况下,适配器将跳过调用。因此,使用受保护的页面来执行HttpServletRequest。建议注销(),以便始终考虑当前令牌,并在需要时执行与KeyClope服务器的交互。 https://www.keycloak.org/docs/latest/securing_apps/index.html#logout

    这在受保护的页面中对我有效,但在未受保护的页面中不起作用

    public ExternalContext currentExternalContext() {
            if (FacesContext.getCurrentInstance() == null) {
                throw new RuntimeException("message here ");
            } else {
                return FacesContext.getCurrentInstance().getExternalContext();
             }
        }
    
    public void logout() throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) currentExternalContext().getRequest();
        ExternalContext externalContext = currentExternalContext();
        request.logout();
        externalContext.redirect(externalContext.getRequestContextPath());
    }
    
        3
  •  1
  •   Jalal Kiswani    4 年前

    您需要将Servlet或包含“request.logout()”操作的其余部分作为受保护的资源,以便令牌可用:

    查看以下文档: “”

    服务器正在传递刷新令牌。如果该方法是从 未受保护的页面(不检查有效令牌的页面)的 刷新令牌可能不可用,在这种情况下,适配器将跳过 电话。因此,使用受保护的页执行 HttpServletRequest。建议注销(),以便当前标记 始终考虑并与{project\u name}交互 如果需要,将执行服务器。

    “”