【问题标题】:How to deal with Http Session Timeout when using SSO使用 SSO 时如何处理 Http Session Timeout
【发布时间】:2017-06-20 17:11:57
【问题描述】:

我有一个 Spring 应用程序(我们称它为 A 表示 Authentication)用作身份验证服务器。 A 正在为另外两个应用程序启用 SSOB 代表企业,C 代表客户)。

SSO 身份验证通过重定向完成:

  • 用户转到 BC URL,他被重定向到 A 登录页面进行身份验证。登录后,他会被重定向回 BC 应用程序。

使用org.springframework.security.web.savedrequest.SavedRequest 中的redirectUrl 参数完成重定向。

因此,用户可以来自 BC 应用程序,也可以直接在 A 应用程序上登录他的帐户.

我的问题,如下。假设一个用户想要连接到 B 应用程序,一旦他被重定向到 A 应用程序,他就没有登录。 一段时间后,会话超时,会话被销毁,所以当他登录时,他并没有被重定向到 B 应用程序,而是重定向到他在 A 上的帐户> 应用。

可能的解决方案:

  • 显而易见的方法是在 HttpSession 上禁用超时:

    <session-config> <session-timeout>-1</session-timeout> </session-config>

    这不是一个好主意,因为它存在安全风险,并且会导致身份验证服务器过载。

  • 我添加了一个HttpSessionDestroyedEventApplicationListener 以检测超时并存储要销毁的会话的请求。主要思想是在用户超时后连接后重定向用户。因此,在连接成功后,我会检查AuthenticationSuccessHandler 中的请求缓存,以查看是否存储了请求并重定向用户。

    if (timeOutHandler.isTimeOut()) {
        redirectStrategy.sendRedirect(request, response, 
        timeOutHandler.getRequest().getRedirectUrl());
        timeOutHandler.clearSession();
        return;
     }
    

    这种方法的问题是我以前不知道导致超时的用户,我最终可能会遇到这样的情况:

    • 来自 B 应用程序的用户导致超时。
    • 存储重定向到B的请求。
    • 另一个用户来自 C 应用程序也会导致超时。
    • 重定向到 B 的请求被 重定向到 C
    • 第一个用户尝试连接,他将被重定向到应用程序 C

那么,您认为最好的方法是什么,或者您有更好的解决方案吗?

感谢您的帮助。

【问题讨论】:

    标签: java spring session redirect spring-security-oauth2


    【解决方案1】:

    如果有帮助,我采用的解决方案是在登录表单中添加一个隐藏字段并存储重定向 url,因此即使在会话超时后也可以从后端访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多