无法在 Spring 安全 SAML SSO 中更改默认 "reply Url"(断言消费者服务位置)

Unable to change default "reply Url" (assertion consumer service Location) in Spring security SAML SSO

我正在使用 spring security Saml 2.0 和 spring 启动 SSO(单点登录),使用 azure 作为身份提供者。

Spring 安全使用“{baseUrl}/login/saml2/sso/{registrationId}”作为默认“回复Url”,

但我想使用“{baseUrl}/login/{registrationId}”

所以接下来 Official documentation 我写了

RelyingPartyRegistration relyingPartyRegistration = RelyingPartyRegistrations
                .fromMetadataLocation("https://login.microsoftonline.com/<metadata url>")
                .registrationId("azure")
                .entityId("{baseUrl}")
                .assertionConsumerServiceLocation("{baseUrl}/login/{registrationId}")
                .build();

通过这个我进入了登录页面,但是之后有无限循环的登录...

Spring开机无法POST到/login/azure

o.s.security.web.FilterChainProxy        : Securing POST /login/azure
s.s.w.c.SecurityContextPersistenceFilter : Set SecurityContextHolder to empty SecurityContext
o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for http://localhost:8080/login/azure
o.s.s.w.access.AccessDeniedHandlerImpl   : Responding with 403 status code

我尝试允许此端点的 CSRF 和 permitAll 访问,但它无法解析元数据。

我发现它是在过滤器“Saml2WebSsoAuthenticationFilter”中实现的

查看源代码我找到了解决方案。

原来你要更新2个地方的“回复URL”link

  1. RelyingPartyRegistrationapplication.properties 中,就像我在问题中所做的那样。

这将告诉 Spring 成功登录后页面将重定向到哪里,在此 URL IP(身份提供商)上将以 XML 格式提供 SAML 响应。

  1. WebSecurityConfigurerAdapter

所以我们必须明确地告诉 Spring 期待 SAML 对此 URL 的响应并解析它。

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        
        http
                .authorizeRequests(authorize -> authorize
                        .anyRequest().authenticated()
                )
                .saml2Login(h -> h.loginProcessingUrl("/login/{registrationId}"));
   }
}

这将更新 Saml2WebSsoAuthenticationFilter 以使用 /login/{registrationId} 而不是 /login/saml2/sso/{registrationId}

进行 SAML 解析