如果您的重定向登录 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