无法在 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
- 在
RelyingPartyRegistration
或 application.properties
中,就像我在问题中所做的那样。
这将告诉 Spring 成功登录后页面将重定向到哪里,在此 URL IP(身份提供商)上将以 XML 格式提供 SAML 响应。
- 在
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 解析
我正在使用 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
- 在
RelyingPartyRegistration
或application.properties
中,就像我在问题中所做的那样。
这将告诉 Spring 成功登录后页面将重定向到哪里,在此 URL IP(身份提供商)上将以 XML 格式提供 SAML 响应。
- 在
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}