Keycloak注销不会结束会话

我在使用Spring Framework的Java应用程序中使用Keycloak 3.4,使用Keycloak Jetty-81-Adapter 3.4在Jetty 8.1中使用。

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

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

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

我尝试了替代方法,重定向到Keycloak:

对于其他浏览器应用程序,您可以将浏览器重定向到
http:// auth-server / auth / realms / {realm-name} / protocol / openid-connect / logout?redirect_uri = encodedRedirectUri

但是它会在Keycloak日志中抛出连接拒绝错误,因为Keycloak试图直接调用我的webapp。 它对保持活动状态的Keycloak会话没有影响。 我强烈建议不要直接从Keycloak到webapp进行必要的服务器端调用。

为什么HttpServletRequest.logout()在我的情况下不破坏keycloak会话的任何建议? HttpServletRequest的Jetty实现是否与Java EE实现完全不同,它根本无法工作?

我在使用远程(OIDC)身份提供程序时有过类似的经历。 我发现HttpServletRequest.logout确实在Keycloak破坏了会话,但没有传播到我的远程身份提供者的注销URL。 当进入远程登录站点时,它立即将我重新定向回来,看到我有一个活跃的会话。 这看起来很像keycloak会话实际上没有失效,但我检查了它。 使用浏览器重定向到url会在两个地方都注销。 可能是Keycloak一个错误。

可能是你面临同样的问题吗? 要进行validation,请尝试注销,然后在keycloak和列表会话中选择您的客户端,以查看它是否仍存在于Keycloak中。