Получить полный ответ SAML в расширении SAML Spring Security
У меня есть приложение Spring Boot, которое настроено как поставщик услуг. Моя конечная цель - иметь возможность вызывать роль AWS STS Assume Role со службой SAML для создания временных учетных данных AWS от имени пользователя с ответом SAML, используемым для первоначальной аутентификации пользователей моего приложения.
Я нашел этот другой вопрос. С этим ответом я могу получить только утверждение, а не весь ответ. По результатам моего тестирования, вызов API AWS, связанный выше, требует полного ответа, а не только утверждения.
Я использовал это расширение Chrome для просмотра ответа SAML. Когда я включаю все (обрисуйте в общих чертах ниже)
<samlp:Response>
...
<saml:Assertion>
...
</saml:Assertion>
</samlp:Response>
AWS STS Предполагает, что роль с SAML работает. Ответ на другой связанный вопрос только дает мне
<saml:Assertion>...</saml:Assertion>
блок и AWS STS предположить, что роль с SAML не выполняется.
Итак, мой вопрос: как мне вернуть весь XML-объект SAML Response обратно в контроллер моего приложения Spring Boot?
0 ответов
Я не знаю прямого способа в 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);
}
`