2015-04-30 71 views
0

我有一个使用表单身份验证的ASP.Net MVC网站,其中loginUrl设置为用于在web.config中进行身份验证的Url。登录过程调用登录控制器,通过SSO进程进行重定向等,日志进程正常工作,用户可以登录等。作为登录过程的一部分,我使用returnUrl将用户发送到他们最初的页面请求。如果没有指定,则为默认值。从ASP.Net中的控制器中的请求获取#路由MVC

如果用户在Url中键入另一个页面,例如http://mysite/help,那么returnUrl与预期的/帮助类似。但是,如果用户输入一个包含像http://mysite/#/test/123这样的散列路径的url,那么returnUrl就是/。是否有可能从控制器中获得#/ test/123的完整url?

要隔离这个问题,我创建了一个演示了此行为简单的ASP.Net MVC Web项目,正如你可以看到#路由丢失时,控制器称为:

这里是web.config中:

web.config

这里是在浏览器的请求:

enter image description here

这里是测试应用程序的调试视图,您可以在其中看到ReturnUrl只是/并且RawUrl只有查询字符串。

enter image description here

这里是小提琴手一样的:

enter image description here

这里是重定向到铬登录URL。正如你所看到的那样,URL的#部分以某种方式保存在示例应用程序中,尽管它在控制器中的请求中不存在,并且我没有在提琴手中看到它。

enter image description here

+0

@ErikFunkenbusch - 谢谢我怀疑这是发生了什么事。我最终将我需要的#个参数传递给查询字符串参数,然后在将用户发送到页面时添加了这些参数。 I.E?hashstate = test%2f/3。如果你写这个答案我会接受这个解决方案。 – kmcnamee

回答

1

的“#”被称为片段和被认为是“依赖客户端”。换句话说,它是针对客户端的,不会被发送回服务器。所以,服务器不知道该片段可能要重定向到什么。见

http://en.wikipedia.org/wiki/Fragment_identifier

从维基百科的文章:

片段取决于文档的MIME类型和客户端(浏览器)进行评估。在检索文档时,客户端不应该向服务器发送URI片段,也不需要本地应用程序(请参见下文)的帮助(参见下文)不参与HTTP重定向[

相关问题