无法更改spring security saml sso中的默认“回复url”(Assert使用者服务位置)

huwehgph  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(644)

我正在使用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”中实现的

zour9fqk

zour9fqk1#

在源代码中我找到了解决方案。
原来你必须更新“回复网址”链接在2个地方
RelyingPartyRegistration 或在 application.properties 就像我刚才说的那样。
这将告诉spring在成功登录后页面将被重定向到哪里,在这个url上,ip(身份提供者)将以xml格式提供saml响应。
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}

相关问题