配置 SAML2:绕过“InResponseTo”验证,同时保留 OpenSaml4AuthenticationProvider 中的默认设置

问题描述 投票:0回答:1
我有一个 Java 后端应用程序在 Nginx 和 SSO 的 spring security 后面运行。我的后端应用程序缺乏一种记住 cookie 会话的机制,因为 SSO 请求可能由一个 java 实例发起,而断言可能会到达其他实例。现有的默认实现需要验证“InResponseTo”属性(如果存在)。默认实现基于http会话,通过cookie来跟踪会话。保留cookie的目的是记住id属性并随后与InResponseTo匹配以防止重放攻击。 InResponseTo 是 SAML2.0 规范中的可选属性。我想知道是否有办法禁用“InResponseTo”验证,同时仍然利用 OpenSaml4AuthenticationProvider 提供的默认验证。值得注意的是,SAML2 认为“InResponseTo”属性是可选的。维持默认验证但通过后端配置设置绕过“InResponseTo”的最佳方法是什么?

我的应用程序基本配置如下所示。

@Configuration public class ApplicationConfiguration { @Autowired SamlSuccessHandler successHandler; @Bean SecurityFilterChain configure(HttpSecurity http) throws Exception { return http.authorizeHttpRequests(authorize -> authorize .anyRequest().authenticated() ).saml2Login(saml2->{ saml2.loginProcessingUrl("/saml/SSO") .successHandler(successHandler); }).build(); } }
应用程序.yml

spring: security: saml2: relyingparty: registration: sap-account400: entity-id: my_entity_id identityprovider: entity-id: https://my-service.com singlesignon.sign-request: true assertingparty: metadata-uri: https://okta.com/1234 decryption: credentials: - private-key-location: classpath:private_key_encryption.pem certificate-location: classpath:certificate_encryption.crt signing: credentials: - private-key-location: classpath:private_key.pem certificate-location: classpath:certificate.crt acs: location: http://localhost:8080/saml/SSO
    
spring spring-security saml saml-2.0 spring-saml
1个回答
0
投票
要禁用

InResponseTo

 验证,您需要自定义 
OpenSaml4AuthenticationProvider
。默认情况下,它验证状态代码、
InResponseTo
属性、
Destination
属性和
Issuer
属性。

最简单的方法是删除

InResponseTo

 验证结果,如下所示:

@Component final class ResponseValidator implements Converter<Response, Saml2ResponseValidatorResult> { private final Converter<ResponseToken, Saml2ResponseValidatorResult> delegate = OpenSaml4AuthenticationProvider.createDefaultResponseValidator(); @Override public Saml2ResponseValidatorResult convert(ResponseToken response) { Saml2ResponseValidatorResult result = this.delegate.convert(response); Collection<Saml2Error> errors = result.getErrors().stream() .filter((error) -> !error.getErrorCode().equals(INVALID_IN_RESPONSE_TO)) .collect(Collectors.toList()); return Saml2ResponseValidatorResult.failure(errors); } } ... @Bean AuthenticationProvider authenticationProvider(ResponseValidator validator) { OpenSaml4AuthenticationProvider authenticationProvider = new OpenSaml4AuthenticationProvider(); authenticationProvider.setResponseValidator(validator); return authenticationProvider; }
但是,我建议您首先尝试将 IdP 配置为不包含您不打算验证的信息。

建议的替代方案

不要禁用验证,而是考虑将请求存储在后端的其他共享存储(例如缓存)中。为此,您可以相对轻松地

自定义Saml2AuthenticationRequestsRepository

。为了完全符合 SAML 2.0,需要某种形式的缓存(参见第 602 行)。
    

© www.soinside.com 2019 - 2024. All rights reserved.