【发布时间】:2022-01-10 15:10:02
【问题描述】:
我想构建一个使用 Spring Boot 托管的站点,并且我想使用 AWS SSO 作为 SAML 身份提供商进行身份验证。我已经构建了一个 PoC 应用程序并尝试遵循 AWS 配置说明和我可以找到的 Spring SAML 示例,但是当我浏览到我的站点(在本地主机上)时,AWS SSO 成功打开,但随后因“输入错误”而失败。
在我的 PoC 应用程序中(只有身份验证代码和索引页面)我有:
- 添加了
spring-security-saml2-service-provider依赖项(Spring Boot v2.6.2) - 在 AWS SSO 中设置自定义应用程序
- 生成了一个私钥和一个自签名证书
- 如下配置我的应用程序属性:
spring:
security:
saml2:
relyingparty:
registration:
metadata:
signing.credentials:
- private-key-location: classpath:key.pem
certificate-location: classpath:cert.pem
identityprovider:
metadata-uri: https://portal.sso.eu-west-1.amazonaws.com/saml/metadata/my-custom-applications-metadata-uri
- 我的配置文件有这些 bean:
@Bean
RelyingPartyRegistrationResolver relyingPartyRegistrationResolver(
RelyingPartyRegistrationRepository registrations) {
return new DefaultRelyingPartyRegistrationResolver((id) -> registrations.findByRegistrationId("metadata"));
}
@Bean
FilterRegistrationBean<Saml2MetadataFilter> metadata(RelyingPartyRegistrationResolver registrations) {
Saml2MetadataFilter metadata = new Saml2MetadataFilter(registrations, new OpenSamlMetadataResolver());
FilterRegistrationBean<Saml2MetadataFilter> filter = new FilterRegistrationBean<>(metadata);
filter.setOrder(-101);
return filter;
}
- 然后,我从我的 Spring Boot 应用程序(通过
http://localhost:8080/saml2/service-provider-metadata/metadata)下载了元数据并将其输入到 AWS 自定义应用程序配置中。这将 ACS 设置为http://localhost:8080/login/saml2/sso/metadata,将观众设置为http://localhost:8080/saml2/service-provider-metadata/metadata,这似乎是正确的。我的应用程序启动 URL 和中继状态为空白。在属性映射中,我将Subject设置为${user.email},格式为emailAddress。
我使用了 SAML-tracer 插件来试图弄清楚当我向localhost:8080/ 发出请求时会发生什么。我们最终向 AWS 发出 SAML POST(见下文),AWS 重新路由到 GET https://portal.sso.eu-west-1.amazonaws.com/token/whoAmI 成功,然后最终重新路由到 GET https://portal.sso.eu-west-1.amazonaws.com/saml/v2/assertion/very-long-id 失败,400 Bad Request 使我们进入 AWS SSO 中出现问题的页面带有消息{message: "Bad input", __type: "com.amazonaws.switchboard.portal#InvalidRequestException"}。我尝试检查 CloudTrail 以查找更多信息,但它只记录事件AssumeRoleWithSAML,然后是ConsoleLogin,它们都成功了。这是我的应用程序发布到 AWS 的 SAML-tracer 显示的 SAML 数据(替换了可能敏感的信息):
<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
AssertionConsumerServiceURL="http://localhost:8080/login/saml2/sso/metadata"
Destination="https://portal.sso.eu-west-1.amazonaws.com/saml/assertion/insert-long-id"
ID="a-long-id"
IssueInstant="2022-01-10T13:59:52.963Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Version="2.0"
>
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost:8080/saml2/service-provider-metadata/metadata</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#Anot-sure-if-secret-random-characters">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>some-more-characters</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>a-long-base-64-encoded-block-of-characters</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>a-long-encoded-certificate</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</saml2p:AuthnRequest>
我试图找到有关 AWS SSO 期望如何发送数据或“错误输入”的实际含义的更多信息,但真的很难找到。我也尝试了一些尝试发送请求而不用我的私钥/证书签名,但这似乎并没有让我到任何地方。我怀疑密钥/证书过程有误,或者我没有正确设置 AWS,但我不确定如何继续。有人有什么想法吗?
【问题讨论】:
标签: amazon-web-services spring-boot single-sign-on saml spring-saml