Spring 启动 SAML 和 AWS Cognito

Spring Boot SAML and AWS Cognito

我有一个可用的 Cognito 应用程序客户端,它使用连接到 SAML 的用户池。它作为 IdP 访问 Azure AD。当我单击“启动托管 UI”时,它会正确地将我重定向到登录屏幕,并在身份验证时尝试加载我的回调 URL。 现在我想用 Spring 引导应用程序连接它。 我发现 this example developed by Joe Grandja 使用 spring-security-saml2-service-provider 连接到简单的 IdP。

该示例非常有说服力,因为我真正需要做的就是提供正确的配置,示例中的配置如下所示:

spring:
  security:
    saml2:
      relyingparty:
        registration:
          simplesamlphp:
            signing.credentials:
              - private-key-location: "classpath:credentials/rp-private.key"
                certificate-location: "classpath:credentials/rp-certificate.crt"
            identityprovider:
              entity-id: https://simplesaml-for-spring-saml.apps.pcfone.io/saml2/idp/metadata.php
              verification.credentials:
                - certificate-location: "classpath:credentials/idp-certificate.crt"
              sso-url: https://simplesaml-for-spring-saml.apps.pcfone.io/saml2/idp/SSOService.php

但是我不知道如何将我可用的信息从 Cognito 映射到这些设置?例如 signing.credentials?

中的值

这是我从 Cognito 获得的设置列表(所有 keys/names 都是假的):

我还有一个从 IdP 取回的 SAML 格式的文件,但它已经插入到 Cognito 中,所以我为什么要将其中的任何内容放入应用程序配置中?

我想知道 spring-security-saml2-service-provider 的一部分是否用于 assemble 登录 URL 以及我是否可以使用示例中给出的较少设置?

任何指点将不胜感激

signing.credentials 部分是您的应用是否需要签署 an AuthnRequest 之类的内容。它们是您拥有的凭据。

identityprovider 下的项目是 Cognito 会提供的东西。

对于 Spring Boot 2.4+,如果 Cognito 支持 SAML 元数据端点,则 you can provide that 和 Spring 安全将发现其余部分:

spring:
  security:
    saml2:
      relyingparty:
        registration:
          simplesamlphp:
            identityprovider:
              metadata-uri: classpath:cognito/metadata/file/location

或者,对于早期版本,您可以 use RelyingPartyRegistrations:

@Bean
RelyingPartyRegistrationRepository registrations() {
    String location = "classpath:cognito/metadata/file/location";
    RelyingPartyRegistration registration = 
        RelyingPartyRegistrations.fromMetadataLocation(location)
            .build();
    return new InMemoryRelyingPartyRegistration(registration);
}

也就是说,您发布的有关 Cognito 身份验证端点的信息似乎是基于 OAuth 的,尤其是登录 URL。您可以改为考虑 configuring your app for OAuth 2.0 并指向 Cognito 的 OAuth 端点。

我将解决方案作为单独的答案发布,但是信用和接受的答案转到@jzheaux

基本上评论部分提供了非常需要的提示:即使您连接基于 SAML 的身份提供商,您也将使用 AWS 控制台中为您提供的 OAuth 信息连接 Cognito User Pool

在我的具体情况下,application.yaml 看起来像这样:

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            client-id: 1ab2cd34efghi5jk6klmno7p8
            client-secret: *********
            scope: openid
            redirect-uri: http://localhost:8080/login/oauth2/code/cognito
            clientName: foobar-sandbox
        provider:
          cognito:
            issuerUri: https://cognito-idp.us-west-2.amazonaws.com/us-west-2_abCDeFGHI
            user-name-attribute: cognito:username

client-secretGeneral settings -> App clients -> Show Details

中找到