0

我正在尝试通过RelyingPartyRegistrationRepository使用 spring security 5.3 配置多个 idp 这是我的 application.yaml 配置

spring:
  security:
    saml2:
      relyingparty:
        registration:
          idpokta:
            identityprovider:
              entity-id: http://<url>
              sso-url: https://<url>
              verification:
                credentials:
                  - certificate-location: "classpath:saml/okta.cert"
              signing:
                credentials:
                  certificate: |
                    -----BEGIN CERTIFICATE-----
                    MIIDpDCC...
                    -----END CERTIFICATE-----
                  private-key: |
                    -----BEGIN PRIVATE KEY-----
                    MIIEvQIBA....

                    -----END PRIVATE KEY-----

          idponelogin:
            identityprovider:
              entity-id: https://<url>
              sso-url: https://<url>
              verification:
                credentials:
                  - certificate-location: "classpath:saml/onelogin.cert"
            signing:
              credentials:
                certificate: |
                  -----BEGIN CERTIFICATE-----
                  MIID/z...
                  -----END CERTIFICATE-----
                private-key: |
                  -----BEGIN PRIVATE KEY-----
                  MIpoi...

                  -----END PRIVATE KEY-----

我的登录控制器定义如下:

@Controller
public class LoginController {
    private final RelyingPartyRegistrationRepository relyingParties;

    // ... 

   @GetMapping("/login")
  public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String registrationId = request.getParameter("idp");
    RelyingPartyRegistration relyingParty = this.relyingParties
            .findByRegistrationId(registrationId);
    if (relyingParty == null) {
      response.setStatus(401);
    } else {
      response.sendRedirect("/saml2/authenticate/" + registrationId);
    }
}

问题 我的relyingParty 有提供程序的详细信息,但我认为myassertionConsumerServiceUrl默认为{baseUrl}/login/saml2/sso/{registrationId}并且my localEntityIdTemplate= {baseUrl}/saml2/service-provider-metadata/{registrationId}` 的事实导致了它的问题。如何在我的 yaml 文件中添加 sp 信息?还是我这样做完全错了?

截屏 在此处输入图像描述

4

2 回答 2

0

从您发布的屏幕截图中,似乎assertionConsumerServiceUrl="{baseUrl}/login/saml2/sso/{registrationId}"在运行时(因此绑定不起作用)。以我的经验,我通过替换baseUrlregistrationId使用实际值(绕过占位符)让它工作。

例如:http://localhost:8080/login/saml2/sso/idpokta

这同样适用于localEntityIdTemplatehttp://localhost:8080/saml2/service-provider-metadata/idpokta

于 2020-11-18T11:38:32.943 回答
0

我一直在尝试做同样的事情。API 似乎没有经过深思熟虑。如果您尝试使用自动配置 spring boot 功能,我发现的唯一方法是排除此配置

Saml2RelyingPartyRegistrationConfiguration

并为此提供您自己的课程。

由于所有这些都是本地包裹,因此您必须携带几乎整个包裹

org.springframework.boot.autoconfigure.security.saml2

到您自己的应用程序,首先完全禁用 spring 中的应用程序。

你最终会得到

CustomRegistrationConfiguredCondition
CustomSaml2LoginConfiguration
CustomSaml2RelyingPartyAutoConfiguration
CustomSaml2RelyingPartyRegistrationConfiguration

至少。确保类之间的引用也更新。

现在,您需要更新 CustomSaml2RelyingPartyRegistrationConfiguration 中的以下方法:

    private RelyingPartyRegistration asRegistration(String id, Registration properties) {
        RelyingPartyRegistration.Builder builder = RelyingPartyRegistration.withRegistrationId(id);
        builder.assertionConsumerServiceUrlTemplate(
                "{baseUrl}" + Saml2WebSsoAuthenticationFilter.DEFAULT_FILTER_PROCESSES_URI);
        builder.idpWebSsoUrl(properties.getIdentityprovider().getSsoUrl());
        builder.remoteIdpEntityId(properties.getIdentityprovider().getEntityId());
        builder.localEntityIdTemplate("template_you_like");
        builder.credentials((credentials) -> credentials.addAll(asCredentials(properties)));
        return builder.build();
    }

或者,您也可以将 Saml2RelyingPartyProperties 复制到您的项目并在那里添加所有必要的字段。这样您就可以在 yaml 或属性文件中设置属性。不要忘记在上面提到的 asRegistration 方法中使用这些值。

于 2020-05-28T23:26:13.327 回答