应用程序会话到期时Spring Security SAML断言到期

时间:2015-04-29 21:24:35

标签: angularjs session spring-security saml-2.0 spring-saml

我对SAML断言到期与应用程序会话到期感到困惑。

简单来说,当我们在容器中部署应用程序时,会创建一个会话。可以使用web.xml中的以下条目控制此会话到期时间

<session-config>
    <session-timeout>60</session-timeout>
</session-config>

接下来,当我使用SAML扩展的Spring Security时,显然会应用相同的会话概念。 (我正在WildFly 8.2中部署应用程序,如果这很重要)

此外,当应用程序会话到期时,注销行为似乎等同于本地注销概念。

到目前为止一切顺利。现在让我们说SAML断言好2小时,用户已经积极工作了2个小时。接下来的请求会发生什么?它应该重新登录IDP吗?但是,这对用户来说不方便吗?如果应用程序重定向到IDP以在断言到期2小时后再次登录,那么应如何处理AJAX请求?

这是参考the question here

1 个答案:

答案 0 :(得分:7)

Spring SAML为经过身份验证的用户发出ExpiringUsernameAuthenticationToken。一旦用于验证用户的SAML断言达到其isAuthenticated()时间,令牌就会在其sessionNotOnOrAfter方法中返回false。

可以通过覆盖SAMLAuthenticationProvider和更改方法getExpirationDate(credential)来禁用此行为,该方法返回Assertion到期时的时间,或null以防万一。然后,应用程序将完全依赖于容器中配置的会话到期。

一旦ExpiringUsernameAuthenticationToken到期,Spring Security会将当前令牌传递给AuthenticationManager(在<security:authentication-manager>下的securityContext.xml中配置)。

您可以添加自己的AuthenticationProvider来处理ExpiringUsernameAuthenticationToken,从而影响接下来发生的事情。否则,系统会因ProviderNotFoundException或其他AuthenticationException BadCredentialsException而失败(如果您同时使用用户名/密码验证)。

该异常随后由ExceptionTranslationFilter处理,它通过调用配置的身份验证EntryPoint来启动新的身份验证过程 - 例如SAMLEntryPoint,使用默认IDP启动身份验证或显示IDP选择页面。正如您所说,该过程基本上也会执行本地注销。

默认情况下,系统对所有HTTP调用的行为都相同 - 无论是否为AJAX。您可以通过将API和普通网址拆分为单独的<security:http>元素并为每个元素使用不同的EntryPoints(接口AuthenticationEntryPoint)来定义不同的行为。例如,Http403ForbiddenEntryPoint可能适合您的AJAX调用。