我对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请求?
答案 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调用。