【问题标题】:Spring Security SAML2 dynamic selection of IDPs or dynamic URLs for themSpring Security SAML2 动态选择 IDP 或动态 URL
【发布时间】:2020-06-22 20:47:14
【问题描述】:

我们正在尝试在应用程序中配置多个身份提供程序以支持不同类型的 SSO。 问题是对于未经身份验证的请求,应用程序不知道要重定向到哪个 IDP。 我们可以根据域名确定使用哪个 IDP。这不是问题。 问题是改变过滤器重定向到特定 IDP 的方式,而不是第一个找到的。

我想知道在 Spring Security 或其 SAML2 库中是否有一种简单的方法来支持它。

我可以以某种方式修改元数据以将其重定向到我自己的 URL(然后在那里有一些自定义代码),或者让身份验证过滤器根据某些条件选择正确的 IDP。

更新

当前 yaml 配置:

spring:
  security:
    saml2:
      relyingparty:
        registration:
          idpone:
            identityprovider:
              entity-id: https://idpone.com
              sso-url: https://idpone.com
              verification: 
                credentials:
                - certificate-location: "classpath:saml/idpone.crt"
          idptwo:
            identityprovider:
              entity-id: https://idptwo.com
              sso-url: https://idptwo.com
              verification: 
                credentials:
                - certificate-location: "classpath:saml/idptwo.crt"

【问题讨论】:

    标签: java spring spring-security saml-2.0 spring-security-saml2


    【解决方案1】:

    从 Spring Security 5.2 开始,您可以通过 RelyingPartyRegistrationRepository 设置多个 IDP。

    在使用 Spring Boot 时,每个看起来都像这样:

    spring:
      security:
        saml2:
          relyingparty:
            registration:
              idpone:
                identityprovider:
                  verification:
                    credentials:
                      - certificate-location: "classpath:idpOne.crt"
                  entity-id: https://idp.example.org
                  sso-url: https://idp.example.org/SSOService.saml2
              idptwo:
                identityprovider:
                  ...
    

    然后,您可以通过导航到 http://localhost:8080/saml2/authenticate/idpOneidpOne 发起 AuthNRequest。

    按主机名

    如果你想通过主机名来做,那么你可以自定义/login页面来知道重定向到哪个/saml2/authenticate/{registrationId}端点。

    首先,你会告诉 Spring Security 你有一个自定义的/login 页面,所以它不会创建一个:

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) {
            http
                .authorizeRequests(authz -> authz
                    .mvcMatchers("/login").permitAll() // here
                    .anyRequest().authenticated())
                .saml2Login(saml2 -> saml2.loginPage("/login")) // and here
        }
    
    }
    

    然后,你会定义它:

    @Controller
    public class LoginController {
        private final RelyingPartyRegistrationRepository relyingParties;
    
        // ... constructor
    
        @GetMapping("/login")
        public void login(HttpServletRequest request, HttpServletResponse response) {
            String registrationId = // ... derive from the host name
            RelyingPartyRegistration relyingParty = this.relyingParties
                    .findByRegistrationId(registrationId);
            if (relyingParty == null) {
                response.setStatusCode(401);
            } else {
                response.sendRedirect("/saml2/authenticate/" + registrationId);
            }
        }
    }
    

    /login 端点中查找的原因是确保主机名中提供的registrationId 是合法的。

    【讨论】:

    • jzheaux,我正在尝试按照您建议的方式对其进行配置,但是找不到类 RelyingPartyRegistrationRepository。 spring 不知何故知道这个类,但我什至无法使用 findjar.com 找到这个类...
    • 我正在使用 spring boot 2.2.5 和 spring 5.2.4。
    • 这些是我配置的属性,其中 idpone 代表我的专有 idp 主机名:spring.security.saml2.relyingparty.registration.idpone.identityprovider.verification.credentials=certificate-location: "classpath:saml/ keystore.p12" spring.security.saml2.relyingparty.registration.idpone.identityprovider.entity-id=idpone.com spring.security.saml2.relyingparty.registration.idpone.identityprovider.sso-url="idpone.com/idp/endpoint/HttpPost"跨度>
    • 尝试根据 Spring Security 存储库中的示例检查您的配置:github.com/spring-projects/spring-security/tree/master/samples/…
    • 可能。由于Saml2WebSsoAuthenticationRequestFilter 位于FilterSecurityInterceptor 之前,因此不需要为“/saml2*”添加全部许可。您可能会考虑提出一个新问题,您可以在其中添加一些额外的细节 - 无论应用程序有什么问题,您的应用程序都可能不是第一个遇到它的人。
    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2020-10-06
    • 2013-10-27
    • 2015-07-05
    • 2011-07-14
    • 2011-10-16
    相关资源
    最近更新 更多