Сохранение фрагмента URL в ReturnUrl в аутентификации форм под MVC
У меня есть сценарий, в котором мне нужно отправить пользователя на страницу входа в систему с параметром returnurl, заполненным страницей, на которой они в данный момент находятся, включая фрагмент URL, поэтому, когда они завершают вход в систему, они перенаправляются обратно в исходное состояние. страница и страница прокручивается вниз до определенного местоположения.
В настоящее время все работает, за исключением того, что фрагмент URL теряется, когда returnUrl
парам достигает Login
ActionMethod.
Есть ли способ сохранить этот фрагмент URL, чтобы он не терялся на этапе входа в систему? Я вижу #fragment в url на странице входа в систему, но, кажется, он удаляется, когда я смотрю на значение returnUrl в моем методе входа.
1 ответ
Есть ли способ сохранить этот фрагмент URL, чтобы он не терялся на этапе входа в систему?
Нет, нет Фрагмент URL никогда не отправляется на сервер. Одной из возможностей является изменение returnUrl на клиенте перед передачей его на сервер, чтобы фрагмент URL стал частью строки запроса. Затем, когда вход в систему успешен, и сервер должен перенаправить обратно на returnUrl, он изменит его на исходное значение.
Например, это может выглядеть так перед отправкой в метод Login:
http://example.com/admin/index?fragment=somefragment
Если ваш перенаправленный URL-адрес входа выглядит следующим образом https://example.com/Login?ReturnUrl=%2F#/protected/page
, все, что находится справа от хеша (#), никогда не передается на сервер. Если вы проверите свою форму, вы увидите, что действие формы опускает хеш-фрагмент.
<form action="/Login?ReturnUrl=%2F" id="login-form" method="post" role="form">
....
</form>
Обратите внимание на недостающий фрагмент в действии формы. Я решаю эту проблему, захватывая хеш-фрагмент из URL-адреса и добавляя его обратно в действие формы через javascript. Прямо под формой входа у меня есть встроенный скрипт:
<script type="text/javascript">
window.onload = function () {
var hash = window.location.hash.substr(1);
if (hash !== "") {
var form = document.getElementById('login-form');
var action = form.getAttribute("action") + 'NHASH' + encodeURIComponent(hash);
form.setAttribute("action", action);
}
}
</script>
Итак, теперь действие формы будет выглядеть так action="/Login?ReturnUrl=%2FNHASH%2Fprotected%2Fpage"
. На стороне сервера после успешной аутентификации и перед перенаправлением на ReturnUrl вы заменяетеNHASH
с #
Такие как
returnUrl = returnUrl.Replace("NHASH", "#");
Примечание. Вы можете использовать любой токен для#
. Я просто выбралNHASH