Spring SAML WSO2 刷新断言
Spring SAML WSO2 Refresh Assertion
我已经使用 WSO2 配置了 Spring SAML 应用程序。当用户登录时,他检索有效期为 5 分钟的断言。但是 5 分钟过去后,没有刷新断言发生。
如何在断言过期后在页面重新加载时启用调用 /saml/sso
?也许您知道另一种解决方案?一些 bean 的属性?
maxAuthenticationAge
在 org.springframework.security.saml.websso.WebSSOProfileConsumerImpl
中不工作。
forceAuthN
在 org.springframework.security.saml.websso.WebSSOProfileOptions
中不工作。
首先,在AuthnStatement
中断言不是SessionNotOnOrAfter
属性,所以过期时间是null
。在这种情况下,我从 NotOnOrAfter
属性 的 Conditions
元素获取到期时间,恕我直言,它与 SessionNotOnOrAfter
应该具有的值相同。
其次,为了安全起见,我将过期时间减去 1 分钟以确保断言将始终有效。
解决方法是在自定义 SAMLAuthenticationProvider
getExpirationDate
方法中覆盖:
protected Date getExpirationDate(SAMLCredential credential) {
List<AuthnStatement> statementList = credential.getAuthenticationAssertion().getAuthnStatements();
DateTime expiration = null;
for (AuthnStatement statement : statementList) {
DateTime newExpiration = statement.getSessionNotOnOrAfter();
if (newExpiration != null) {
if (expiration == null || expiration.isAfter(newExpiration)) {
expiration = newExpiration;
}
}
}
if (expiration == null) {
Conditions conditions = credential.getAuthenticationAssertion().getConditions();
expiration = conditions.getNotOnOrAfter();
}
return expiration != null ? expiration.minusMinutes(1).toDate() : null;
}
我已经使用 WSO2 配置了 Spring SAML 应用程序。当用户登录时,他检索有效期为 5 分钟的断言。但是 5 分钟过去后,没有刷新断言发生。
如何在断言过期后在页面重新加载时启用调用 /saml/sso
?也许您知道另一种解决方案?一些 bean 的属性?
maxAuthenticationAge
在 org.springframework.security.saml.websso.WebSSOProfileConsumerImpl
中不工作。
forceAuthN
在 org.springframework.security.saml.websso.WebSSOProfileOptions
中不工作。
首先,在AuthnStatement
中断言不是SessionNotOnOrAfter
属性,所以过期时间是null
。在这种情况下,我从 NotOnOrAfter
属性 的 Conditions
元素获取到期时间,恕我直言,它与 SessionNotOnOrAfter
应该具有的值相同。
其次,为了安全起见,我将过期时间减去 1 分钟以确保断言将始终有效。
解决方法是在自定义 SAMLAuthenticationProvider
getExpirationDate
方法中覆盖:
protected Date getExpirationDate(SAMLCredential credential) {
List<AuthnStatement> statementList = credential.getAuthenticationAssertion().getAuthnStatements();
DateTime expiration = null;
for (AuthnStatement statement : statementList) {
DateTime newExpiration = statement.getSessionNotOnOrAfter();
if (newExpiration != null) {
if (expiration == null || expiration.isAfter(newExpiration)) {
expiration = newExpiration;
}
}
}
if (expiration == null) {
Conditions conditions = credential.getAuthenticationAssertion().getConditions();
expiration = conditions.getNotOnOrAfter();
}
return expiration != null ? expiration.minusMinutes(1).toDate() : null;
}