我正在使用springsecuritysaml2.0和springbootforsso(单点登录),azure作为身份提供者。
Spring Security 使用“{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 boot无法发布到/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访问,但是它无法解析元数据。
我发现它是在过滤器“saml2websoauthenticationfilter”中实现的
1条答案
按热度按时间zour9fqk1#
在源代码中我找到了解决方案。
原来你必须更新“回复网址”链接在2个地方
在
RelyingPartyRegistration
或在application.properties
就像我刚才说的那样。这将告诉spring在成功登录后页面将被重定向到哪里,在这个url上,ip(身份提供者)将以xml格式提供saml响应。
在
WebSecurityConfigurerAdapter
所以我们必须显式地告诉spring在这个url上期望saml响应并解析它。这将更新
Saml2WebSsoAuthenticationFilter
使用/login/{registrationId}
用于saml分析而不是/login/saml2/sso/{registrationId}