在MVC下的表单认证中,在ReturnUrl中保留URLl片段。

问题描述 投票:3回答:2

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

目前,这一切都在工作,除了url片段丢失,当 returnUrl 抵达 Login ActionMethod。

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

asp.net-mvc asp.net-mvc-3 url model-view-controller uri-fragment
2个回答
4
投票

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

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

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

http://example.com/admin/index?fragment=somefragment

0
投票

如果你的重定向登录网址是这样的: https://example.com/Login?ReturnUrl=%2F#/protected/page哈希(#)右边的任何内容都不会被传递给服务器。如果你检查你的表单,你会发现表单操作省略了哈希片段。

<form action="/Login?ReturnUrl=%2F" id="login-form" method="post" role="form">
           ....
</form>

请注意表单动作中缺少的片段。我解决这个问题的方法是通过捕捉url中的hash片段,并通过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

© www.soinside.com 2019 - 2024. All rights reserved.