4

我有一个场景,我需要将用户发送到登录页面,returnurl 参数填充了他们当前所在的页面,包括一个 url 片段,所以当他们完成登录时,他们被重定向回原来的页面,页面向下滚动到特定的#location。

目前,除了returnUrl参数到达LoginActionMethod 时 url 片段丢失之外,一切正常。

有没有办法保留这个 url 片段,这样它就不会在登录阶段丢失?我可以在登录页面的 url 中看到 #fragment,但是当我在登录方法中查看“returnUrl”的值时,它似乎被剥离了。

4

2 回答 2

4

有没有办法保留这个 url 片段,这样它就不会在登录阶段丢失?

不,没有。url 片段永远不会发送到服务器。一种可能性是在将其传递给服务器之前修改客户端上的 returnUrl,以便 url 片段成为查询字符串的一部分。然后,当登录成功并且服务器需要重定向回 returnUrl 时,它会将其修改为原始值。

例如,在将其发送到 Login 方法之前,它可能看起来像这样:

http://example.com/admin/index?fragment=somefragment
于 2011-09-01T12:14:21.230 回答
0

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

于 2020-05-04T19:21:03.430 回答