簡體   English   中英

Keycloak注銷沒有結束 session

[英]Keycloak logout does not end session

我在 Java 應用程序中使用 Keycloak 3.4,使用 Spring 框架和帶有 Keycloak Jetty-81-Adapter 3.4 的 Jetty 8.1。

根據 Keycloak 文檔,我應該能夠在 Java EE 應用程序中使用 HttpServletRequest 從 Keycloak 注銷。 但是,這在我的情況下不起作用,即使 Jetty 支持 HttpServletRequests。

您可以通過多種方式退出 web 應用程序。 對於 Java EE servlet 容器,您可以調用 HttpServletRequest.logout()..

如果我嘗試以這種方式注銷,我將被重定向到 keycloak(登錄屏幕可以選擇多個 realm 登錄)。 但是,當我選擇我喜歡的 realm 時,我會立即再次登錄到 Web 應用程序,而無需提供任何憑據。

我嘗試了另一種方法,重定向到 Keycloak:

對於其他瀏覽器應用程序,您可以將瀏覽器重定向到
http://auth-server/auth/realms/ {realm-name}/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri

但它會在 Keycloak 日志中拋出連接被拒絕的錯誤,因為 Keycloak 試圖以直接方式調用我的 webapp。 它對保持活動狀態的 Keycloak session 沒有影響。 我強烈希望不需要從 Keycloak 直接到 webapp 的服務器端調用。

為什么HttpServletRequest.logout()不會破壞 keycloak session 在我的情況下的任何建議? HttpServletRequest 的 Jetty 實現是否與 Java EE 實現如此不同以至於它根本無法工作?

我在使用遠程 (OIDC) 身份提供商時也有類似的經歷。 我發現HttpServletRequest.logout確實破壞了Keycloak的會話,但沒有傳播到我的遠程身份提供者的注銷 URL。 當轉到遠程登錄站點時,它立即將我重定向回,看到我有一個活動會話。 這看起來很像 keycloak 會話實際上並沒有失效,但我檢查了它。 使用瀏覽器重定向到 url 在兩個地方都注銷了。 可能是Keycloak一個錯誤。

難道你面臨同樣的問題? 要驗證,請嘗試注銷,然后在 keycloak 中選擇您的客戶端並列出會話,以查看它是否仍然存在於 Keycloak 中。

您需要將包含“request.logout()”操作的 Servlet 或 Rest 作為受保護的資源,以便令牌可用:

查看以下文檔:“

服務器傳遞刷新令牌。 如果從不受保護的頁面(不檢查有效令牌的頁面)執行該方法,則刷新令牌可能不可用,在這種情況下,適配器將跳過調用。 出於這個原因,建議使用受保護的頁面來執行 HttpServletRequest.logout() 以便始終考慮當前令牌並在需要時執行與 {project_name} 服務器的交互。

如果從不受保護的頁面(不檢查有效令牌的頁面)執行方法(注銷),則刷新令牌可能不可用,在這種情況下,適配器會跳過調用。 出於這個原因,建議使用受保護的頁面來執行 HttpServletRequest.logout() 以便始終考慮當前令牌,並在需要時執行與 Keycloak 服務器的交互。 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());
}

您可以將“用戶 Session 計數限制器”擴展添加到瀏覽器流程:用戶 Session 計數限制器屏幕截圖

並將其配置為一個 session 並終止最舊的一個:將其配置為一個 session screenshot

你可以查看Keycloak 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM