OpenSAML и RelayState

Я просмотрел форум здесь и прочитал несколько тем, но я не думаю, что есть ответ на мой вопрос. Сказав это, я ни в коем случае не являюсь экспертом SAML, поэтому некоторые темы, которые я читал, я делал с блестящими глазами :).

Я унаследовал некоторый код, который использует OpenSAML (на стороне SP) для создания запроса и его отправки в реализацию ADFS. Проблема, которую я рассматриваю, заключается в том, что пользователь всегда возвращается к одному и тому же URL-адресу, независимо от первоначального запроса, скажем, на глубокую ссылку на сайт. Теперь, что касается ADFS, я знаю, что это перенаправление обратно в SP является статическим, что не поможет, но я на 99,9% уверен, что мы не передаем никаких значений перенаправления провайдеру. Из моего исследования я думаю, что мне следует использовать RelayState для передачи значения, чтобы оно возвращалось мне, чтобы я мог использовать его после обработки ответа SAML.

Моя проблема в том, что я не совсем понимаю, как передать RelayState. В коде, с которым я работаю, я вижу определенный класс -

public class HTTPRedirectTransportSender extends HTTPServletTransportSender
{
    private static final transient Logger LOG = LoggerFactory.getLogger(HTTPRedirectTransportSender.class);

    public HTTPRedirectTransportSender(HttpServletResponse httpServletResponse)
    {
        super(httpServletResponse);
    }


    @Override
    protected BaseHttpServletResponseXMLMessageEncoder buildMessageEncoder()
    {
        return new HTTPRedirectDeflateEncoder();
    }

}  

.. и если я посмотрю на HttpRedirectDeflateDecoder, то увижу некоторую логику построения URL-адреса и тому подобного. Я искал некоторое время, но я не нашел примера, который, я уверен, будет тем, что я ищу, поэтому я надеялся, что эксперт сможет помочь?


person jardineworks    schedule 07.02.2018    source источник
comment
возможно, это может помочь. Я только что ответил на аналогичный вопрос, но для javascript. У меня есть JSP с SAMLRequest и RelayState, который автоматически отправляется POST, но он должен позволить вам увидеть, как отправлять RelayState stackoverflow.com/questions/48700273/   -  person codebrane    schedule 09.02.2018
comment
Просто чтобы прояснить, о чем вы спрашиваете ???? ваш сайт (SP) заставляет браузер клиента выдавать запрос к ADFS (запрос GET)? И теперь вам интересно, как привязать RelayState к этому запросу?   -  person khlr    schedule 11.02.2018


Ответы (2)


Вы определенно думаете об этом правильно. Вы захотите сохранить первоначально введенный пользователем URL-адрес и использовать его в качестве состояния ретрансляции.

Для OpenSAML v3 вы прикрепляете состояние ретрансляции к файлу MessageContext. Вам нужно будет найти, где ваше приложение создает MessageContext, и сделать что-то вроде этого:

SAMLBindingSupport.setRelayState(messageContext, relayState);

Это удобный метод, предоставляемый библиотекой OpenSAML; в фоновом режиме он получает доступ к подконтексту SAMLBindingContext из вашего MessageContext (создавая его при необходимости) и устанавливает для него состояние реле.

messageContext.getSubcontext(SAMLBindingContext.class, true).setRelayState(relayState);
person mpulcini    schedule 16.08.2018

RelayState обычно используется для IDPInitiated в соответствии с это.

Согласно этим, "Не вас смущает тот факт, что RelayState служит двум совершенно разным целям. Для IdPInitiated RelayState указывает целевую страницу в SP. Для SPInitiated это способ для SP поддерживать информацию о состоянии между отправкой AuthnRequest и получением ответа SAML. RelayState может быть отправлен вместе с AuthnRequest, и IDP должен вернуть это RelayState вместе с ответом SAML».

person rbrayb    schedule 07.02.2018
comment
Конечно, но, как вы указали в абзаце, он также часто используется SP для сохранения некоторого состояния, например URL-адреса, который был запрошен до начала процесса аутентификации. Если кто-то делает глубокие ссылки на сайт somesite.com/this/is/a/protected /url ... и затем перенаправляется к IdP, который затем возвращает пользователя на somesite.com/saml/auth для обработки ответа, тогда я мог бы использовать состояние ретрансляции в сценарии успеха, чтобы перенаправить пользователя на исходный URL-адрес. Мой вопрос был не столько в том, что такое состояние ретрансляции, сколько в том, КАК передать его IdP. - person jardineworks; 08.02.2018
comment
Как и выше - введите AuthnRequest. - person rbrayb; 08.02.2018