我对 SAML 断言到期与应用程序会话到期感到困惑。
简而言之,当我们将应用程序部署在容器中时,就会创建一个会话。可以使用 web.xml 中的以下条目控制此会话过期
<session-config>
<session-timeout>60</session-timeout>
</session-config>
继续,当我拥有带有 SAML 扩展的 Spring Security 时,显然相同的会话概念适用。 (我正在 WildFly 8.2 中部署应用程序,如果这很重要的话)
此外,当应用程序会话过期时,注销行为似乎等同于本地注销概念。
到目前为止,一切都很好。现在假设 SAML 断言在 2 小时内有效,并且用户已经积极工作了 2 小时。那么接下来的请求会发生什么情况呢?是否应该重新登录 IDP?但是,这对用户来说不是很不方便吗?如果应用程序在断言到期 2 小时后重定向到 IDP 再次登录,应如何处理 AJAX 请求?
这是参考问题在这里 https://stackoverflow.com/questions/26047854/handling-saml-redirects-on-ajax-requests
Spring SAML 发出ExpiringUsernameAuthenticationToken
对于经过身份验证的用户。令牌开始在其内部返回 falseisAuthenticated()
一旦用于验证用户身份的 SAML 断言达到其sessionNotOnOrAfter
time.
可以通过覆盖来禁用此行为SAMLAuthenticationProvider
和改变方法getExpirationDate(credential)
,返回断言过期的时间,或者null
万一它永远不会发生。然后,应用程序将完全依赖容器中配置的会话过期时间。
一旦ExpiringUsernameAuthenticationToken
过期后,Spring Security 会将当前令牌传递给AuthenticationManager
(在 securityContext.xml 下配置<security:authentication-manager>
).
您可以通过添加自己的内容来影响接下来发生的事情AuthenticationProvider
能够处理ExpiringUsernameAuthenticationToken
。否则系统会失败ProviderNotFoundException
或其他一些AuthenticationException
like BadCredentialsException
(如果您同时使用用户名/密码身份验证)。
该异常随后由ExceptionTranslationFilter
,通过调用配置的身份验证来启动新的身份验证过程EntryPoint
- e.g. SAMLEntryPoint
它要么使用默认 IDP 启动身份验证,要么显示 IDP 选择页面。正如您所说,该过程本质上还将执行本地注销。
默认情况下,系统对所有 HTTP 调用的行为都相同 - 无论是否使用 AJAX。您可以通过将 API 和普通 URL 拆分为单独的来定义不同的行为<security:http>
元素并使用不同EntryPoints
(界面AuthenticationEntryPoint
)对于每个。例如Http403ForbiddenEntryPoint
可能适合您的 AJAX 调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)