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



我正在使用spring security Saml 2.0和spring boot for SSO(单点登录(,azure作为身份提供程序。

弹簧安全使用";{baseUrl}/login/saml2/sso/{registrationId}";作为默认";回复Url";,

但是我想使用";{baseUrl}/login/{registrationId}";

因此,遵循官方文件我写了

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用于该端点并允许All访问,但它无法解析元数据。

我发现它是在过滤器"中实现的;Saml2WebSsoAuthenticationFilter";

环顾源代码,我找到了解决方案。

事实证明,您必须更新";回复URL";链接在2个位置

  1. RelyingPartyRegistrationapplication.properties中,就像我所讨论的那样

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

  1. WebSecurityConfigurerAdapter

所以我们必须明确地告诉Spring在这个URL上期望SAML响应并解析它。

@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}进行SAML解析,而不是/login/saml2/sso/{registrationId}

最新更新