Как исправить проблему с кнопкой «Назад» в браузере после SAML SSO от Shibboleth

Создайте веб-приложение поставщика услуг SAML2 на основе .NET MVC (3). Для аутентификации мы используем библиотеку ComponentSpace SAML2, а не Shibboleth SP. Вот соответствующая логика контроллера:

public class SignOnController : Controller
{
    // constructor-inject _services

    [HttpPost]
    public ActionResult SendAuthnRequest(string userName, string returnUrl)
    {
        // this users ComponentSpace internally to push user to IdP
        _services.SamlServiceProvider.SendAuthnRequest(args);
        return new EmptyResult();
    }

    [HttpPost]
    public ActionResult ReceiveAuthnResponse()
    {
        var samlResponse = _services.SamleServiceProvider
            .ReceiveSamlResponse(args);
        // ...
        return Redirect(samlResponse.RelayResourceUrl ?? defaultUrl);
    }
}

В конечном итоге пользователь попадает либо на URL-адрес реле, либо на страницу входа по умолчанию. Однако, когда они щелкают ссылку, а затем нажимают кнопку «Назад», браузер возвращается к странице с ошибкой на сервере Shibboleth IdP. После этого кнопки браузера вперед и назад окончательно становятся бесполезными.

Я делаю что-то неправильно в любом из вышеперечисленных методов? Должен ли я возвращать View() вместо EmptyResult() при отправке? Есть ли способ сбросить историю браузера, чтобы предотвратить повторные обратные передачи обратно к IdP? Это что-то, что я могу настроить в реализации ComponentSpace?


person danludwig    schedule 18.07.2012    source источник
comment
Отличный вопрос. Вы нашли решение? Я занимаюсь той же проблемой.   -  person BryceH    schedule 15.01.2015
comment
@BryceH, к сожалению, нет. Возможно, вы сможете предложить награду за этот вопрос, чтобы посмотреть, знает ли кто-нибудь еще что-нибудь.   -  person danludwig    schedule 15.01.2015


Ответы (4)


Я так понимаю, вы нажали кнопку «Назад» во время аутентификации в профиле IdP и WBSSO SAML2? Я не знаю компонентов, которые вы перечислили, но в случае с Shibboleth он всегда заканчивается страницей с ошибкой. Я могу ошибаться, но если учесть характер связи SP->IdP, я считаю, что другого варианта нет, если только вы не реализуете что-то заново.

person Erwin    schedule 20.07.2012
comment
Нет, кнопка «Назад» нажимается после аутентификации IdP. Пользователь уже находится в нашем приложении SP, прежде чем возникает проблема с кнопкой «Назад». - person danludwig; 20.07.2012

Сообщения протоколов SAML, используемые в SAML SSO, отправляются через браузер. Нажатие кнопок навигации вперед и назад в браузере может вызвать проблемы при использовании SAML SSO, как вы видели.

Простого решения этой проблемы не существует. Вы можете включить Javascript для отключения кнопок навигации, но это, скорее всего, вызовет другие проблемы.

Я думаю, что лучшее и самое простое решение — отобразить общее сообщение об ошибке, если это произойдет. Это то, что вам нужно сделать в вашем приложении.

Наши приложения MvcExampleIdentityProvider и MvcExampleServiceProvider, которые мы поставляем, в большинстве случаев не имеют проблем. Они используют высокоуровневый API SAML, а не низкоуровневый API SAML, используемый в вопросе, но это не должно иметь значения. В наших примерах мы также возвращаем EmptyResult.

person ComponentSpace    schedule 09.05.2015

Мы столкнулись с той же проблемой и решили ее с помощью API истории JavaScript:

https://www.thecssninja.com/javascript/stealing-history-api

Это нехорошо, поскольку, по сути, манипулируется историей просмотров. Но он работает эффективно и предотвращает появление страницы с ошибкой. Кнопки «назад/вперед» внутри вашего веб-приложения продолжают работать правильно, но у пользователя нет возможности вернуться на любую предыдущую страницу, которая не является вашим веб-приложением. Это был компромисс, с которым мы могли жить.

person Jan Petzold    schedule 19.09.2016

Мы используем этот скрипт. Он проверяет, вызывается ли основной URL-адрес из перенаправления SSO. Если это так, он пропускает страницу единого входа, когда пользователь нажимает кнопку «Назад». Если нет, сценарий ничего не делает, потому что кнопка «Назад» работает должным образом.

  (function(window, location) {
        var previous = document.referrer.toLowerCase();
        var issso = previous.indexOf('account/sso');
        if(issso >= 0){
            history.replaceState(null, document.title, location.pathname+"#!/skipsso");
            history.pushState(null, document.title, location.pathname);
            window.addEventListener("popstate", function() {
                if(location.hash === "#!/skipsso") {
                    setTimeout(function(){
                        history.go(-2);
                    },0);
                }
            }, false);
        }
    }(window, location));
person Vincent Vermeulen    schedule 12.03.2018