1

我有一个设置为服务提供者的 Spring Boot 应用程序。我的最终目标是能够使用 SAML 服务调用 AWS STS Assume Role 以代表用户生成 AWS 临时凭证,其中 SAML 响应用于对我的应用程序的用户进行初始身份验证。

我发现了另一个问题。有了这个答案,我只能得到断言,而不是整个响应。根据我的测试,上面链接的 AWS API 调用需要整个响应,而不仅仅是断言部分。

我使用这个Chrome 扩展程序来查看 SAML 响应。当我包括所有内容时(下面的大纲)

<samlp:Response>
   ...
   <saml:Assertion>
       ...
   </saml:Assertion>
</samlp:Response>

使用 SAML 的 AWS STS 代入角色有效。另一个相关问题的答案只为我提供了

<saml:Assertion>...</saml:Assertion>

块并且 AWS STS 代入 SAML 角色失败。

所以我的问题是如何将整个 SAML 响应 XML 对象返回到我的 Spring Boot 应用程序的控制器中?

4

1 回答 1

1

我不知道 spring-security-saml 中的任何直接方式,但也许您可以尝试实现自己的 SAMLProcessingFilter,即简单地扩展现有的并覆盖方法 tryAuthentication()。

原则:

  • 在此方法中,您可以访问从 IdP 返回的响应并回传到 SP(至少在 Redirect-POST 配置文件中)
  • 你可能有办法从 httpRequest 中提取你需要的东西
  • 然后你可以存储(会话,ThreadLocal 变量,...)
  • 最后,您将身份验证过程委托给父级(通过调用 super.attemptAuthentication())

`

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
    if ("POST".equalsIgnoreCase(request.getMethod())) {
        String samlResponse = request.getParameter("SAMLResponse");
        System.out.println("Original SAML Response (base64 decoded) : " + new 
        String(Base64.getDecoder().decode(samlResponse), StandardCharsets.UTF_8));
    }
    return super.attemptAuthentication(request, response);
}

`

于 2019-03-11T22:15:58.353 回答