Spring 安全 SAML 断言到期,应用程序会话到期
Spring Security SAML assertion expiry with Application Session Expiry
我对 SAML 断言到期与应用程序会话到期感到困惑。
简而言之,当我们在容器中部署了一个应用程序时,就会创建一个会话。可以使用 web.xml
中的以下条目控制此会话过期
<session-config>
<session-timeout>60</session-timeout>
</session-config>
继续,当我有 Spring 带有 SAML 扩展的安全性时,显然同样的会话概念适用。 (如果重要的话,我正在 WildFly 8.2 中部署应用程序)
此外,当应用程序会话过期时,注销行为似乎等同于本地注销概念。
到目前为止一切顺利。现在假设 SAML 断言有效 2 小时,并且用户已经积极工作了 2 小时。那么后续请求应该怎么办呢?它应该重新登录 IDP 吗?但是,这不会给用户带来不便吗?如果应用程序在 assertion 过期 2 小时后重定向到 IDP 重新登录,应该如何处理 AJAX 请求?
这是参考 the question here
Spring SAML 为经过身份验证的用户发出 ExpiringUsernameAuthenticationToken
。一旦用于验证用户身份的 SAML 断言达到其 sessionNotOnOrAfter
时间,令牌便开始在其 isAuthenticated()
方法中返回 false。
可以通过覆盖 SAMLAuthenticationProvider
和更改方法 getExpirationDate(credential)
来禁用此行为,其中 returns 断言过期时间,或 null
以防它永远不会过期。然后,应用程序将完全依赖容器中配置的会话过期时间。
一旦 ExpiringUsernameAuthenticationToken
过期,Spring 安全会将当前令牌传递给 AuthenticationManager
(在 <security:authentication-manager>
下的 securityContext.xml 中配置)。
您可以通过添加自己的 AuthenticationProvider
能够处理 ExpiringUsernameAuthenticationToken
来影响接下来发生的事情。否则系统会失败并显示 ProviderNotFoundException
或其他一些 AuthenticationException
,例如 BadCredentialsException
(以防您同时使用 username/password 身份验证)。
异常随后由 ExceptionTranslationFilter
处理,它通过调用配置的身份验证 EntryPoint
启动新的身份验证过程 - 例如SAMLEntryPoint
使用默认 IDP 启动身份验证或显示 IDP 选择页面。如您所说,该过程实际上还将执行本地注销。
默认情况下,系统对所有 HTTP 调用的行为都相同 - AJAX 或不同。您可以通过将 API 和普通 URL 拆分为单独的 <security:http>
元素并为每个元素使用不同的 EntryPoints
(接口 AuthenticationEntryPoint
)来定义不同的行为。例如 Http403ForbiddenEntryPoint
可能适合您的 AJAX 通话。
我对 SAML 断言到期与应用程序会话到期感到困惑。
简而言之,当我们在容器中部署了一个应用程序时,就会创建一个会话。可以使用 web.xml
中的以下条目控制此会话过期<session-config>
<session-timeout>60</session-timeout>
</session-config>
继续,当我有 Spring 带有 SAML 扩展的安全性时,显然同样的会话概念适用。 (如果重要的话,我正在 WildFly 8.2 中部署应用程序)
此外,当应用程序会话过期时,注销行为似乎等同于本地注销概念。
到目前为止一切顺利。现在假设 SAML 断言有效 2 小时,并且用户已经积极工作了 2 小时。那么后续请求应该怎么办呢?它应该重新登录 IDP 吗?但是,这不会给用户带来不便吗?如果应用程序在 assertion 过期 2 小时后重定向到 IDP 重新登录,应该如何处理 AJAX 请求?
这是参考 the question here
Spring SAML 为经过身份验证的用户发出 ExpiringUsernameAuthenticationToken
。一旦用于验证用户身份的 SAML 断言达到其 sessionNotOnOrAfter
时间,令牌便开始在其 isAuthenticated()
方法中返回 false。
可以通过覆盖 SAMLAuthenticationProvider
和更改方法 getExpirationDate(credential)
来禁用此行为,其中 returns 断言过期时间,或 null
以防它永远不会过期。然后,应用程序将完全依赖容器中配置的会话过期时间。
一旦 ExpiringUsernameAuthenticationToken
过期,Spring 安全会将当前令牌传递给 AuthenticationManager
(在 <security:authentication-manager>
下的 securityContext.xml 中配置)。
您可以通过添加自己的 AuthenticationProvider
能够处理 ExpiringUsernameAuthenticationToken
来影响接下来发生的事情。否则系统会失败并显示 ProviderNotFoundException
或其他一些 AuthenticationException
,例如 BadCredentialsException
(以防您同时使用 username/password 身份验证)。
异常随后由 ExceptionTranslationFilter
处理,它通过调用配置的身份验证 EntryPoint
启动新的身份验证过程 - 例如SAMLEntryPoint
使用默认 IDP 启动身份验证或显示 IDP 选择页面。如您所说,该过程实际上还将执行本地注销。
默认情况下,系统对所有 HTTP 调用的行为都相同 - AJAX 或不同。您可以通过将 API 和普通 URL 拆分为单独的 <security:http>
元素并为每个元素使用不同的 EntryPoints
(接口 AuthenticationEntryPoint
)来定义不同的行为。例如 Http403ForbiddenEntryPoint
可能适合您的 AJAX 通话。