重定向到在MVC4中中断了哈希标记(#)的原始URL

时间:2013-10-22 09:16:06

标签: asp.net-mvc-4 authentication single-page-application

我正在使用AngularJS开发一个SPA应用程序,使用REST Web API,在一个非常小的ASP.NET MVC4层上。由于这里不重要的原因,我没有使用MVC4的默认帐户控制器。

基本上,我想在用户之间共享“任务”。我的目标是能够通过电子邮件将特定“任务”实体的URL发送给任何用户。单击该URL应启动身份验证。身份验证成功后,我想显示真实的任务页面信息。

AngularJS使我的网址有#符号,或显示任务“XYZ123”的网页的网址为: http://hostname.com/#/tasks/XYZ123

ASP.NET将对该URL的未授权访问重定向到: http://hostname.com/Home/Login?ReturnUrl=%2f#/tasks/XYZ123

这没关系,但相关的控制器方法会“切断”#的路径,所以在:

 public ActionResult Login(string returnUrl)

'returnUrl'的值只是“/”

所以,我正在失去道路:我想建立一个具有原始网址的“与Facebook连接”链接,如:

http://hostname.com/Login/ExternalLogin?ReturnUrl=%2F#/tasks/XYZ123

但我不能。

解决此问题的正确方法是什么?

我可以考虑在没有#tag的情况下创建自己的重定向服务URL,但是这个解决方案意味着额外的工作,并且仅涵盖系统发送带有任务URL的消息的情况 - 人类仍将尝试复制/粘贴该位置来自浏览器的网址。

感谢任何提示。

最高

3 个答案:

答案 0 :(得分:3)

是。浏览器切换## tasks / XYZ123'并请求没有该哈希的页面。 虽然哈希本身出现在登录页面上 - 但它又是浏览器的工作。 哈希没有前往服务器。

因此,当浏览器使用?ReturnUrl =%2f#/ tasks / XYZ123加载登录页面时,我们可以重写表单操作并对哈希进行编码。

如果表单如下:

<form action="/Home/Login" method="post" >
    ...
</form>

javascript代码应如下所示:

<script src="~/js/jquery.js"></script>

<script type="text/javascript">
    $(function() {

        var search = $(location).attr('search') || '';
        var hash = $(location).attr('hash') || '';

        if (hash.length === 0) {                
            if (window.history.pushState) {
                window.history.pushState('login', 'Login', '/Home/Login');
            }
        } else if (search === '?ReturnUrl=%2f') {
            $('form').attr('action', '/Home/Login' + search + encodeURIComponent(hash) );
        }

    });

</script>

以下内容需要包含 window.history.pushState 的部分:

如果没有哈希值,那么对于SPA,其URL(更有可能)将是:

http://hostname.com/Home/Login?ReturnUrl=%2f

所以这里我们尝试用更准确的

替换URL(没有页面重新加载)
http://hostname.com/Home/Login

答案 1 :(得分:0)

您可以使用Request(如.Url.QueryString)的属性来获取原始网址(和网址参数),而不是依赖于returnUrl参数的自动绑定。

答案 2 :(得分:0)

用%23替换returnUrl中的#