Я реализую поток аутентификации SSO с использованием SAML для веб-сервера, на котором запущен tomcat. При использовании привязок POST или Redirect все работает нормально, но из того, что я прочитал для поддержки аутентификации SAML перед REST API, мне также нужно настроить и использовать профиль ECP.
Сначала поправьте меня, если я ошибаюсь, но поток ECP должен быть таким:
- Client accesses the SP REST API
- Client knows he needs to authenticate so he sets up the required ECP headers (
Accept: application/vnd.paos+xmlandPAOS: urn:liberty:paos:2003-08;urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp)
- Client knows he needs to authenticate so he sets up the required ECP headers (
- SP видит, что клиент не аутентифицирован, и возвращает SOAP Envelop, содержащий запрос PAOS.
- Клиент обязан отправить это соответствующему IdP в своей потребительской службе ECP.
- IdP запрашивает у клиента аутентификацию
- IdP возвращает ответ в форме другого конверта SOAP, содержащего в своем теле ответ saml.
- Клиент должен отправить этот ответ в службу получателя утверждений ECP / SOAP SP.
Проблема в том, что все это работает до шага 6. На этом шаге у меня проблема в том, что тело конверта ответа содержит атрибут «Назначение», который указывает на службу потребителей утверждений POST SP. Этот атрибут назначения устанавливается keycloak и не соответствует фактической службе ECP, на которую я хочу отправить ответ. Используемая нами библиотека SAML - opensaml, она проверяет URI запроса на соответствие этому атрибуту Destination и, если они не совпадают, выдает исключение org.opensaml.xml.security.SecurityException: SAML message intended destination endpoint did not match recipient endpoint.
Я понимаю, почему возникает это исключение, но не могу понять, как настроить Keycloak с помощью службы ECP / SOAP SP. В консоли администратора Keycloak я могу настроить только URL-адреса для SSO POST / Redirect и SLO POST / Redirect, но ничего о ECP.
В настоящее время я настраиваю другого IdP, но мне бы очень хотелось убедиться, что Keycloak также может быть поддерживаемым сервером для нашего решения.