ASP.NET MVC中的ReturnUrl

Kev*_*ang 30 asp.net-mvc

我目前在我的应用程序上有一个登录链接,如下所示:

<a href="/login?ReturnUrl=" + <%= Request.RawUrl %>>Login</a>
Run Code Online (Sandbox Code Playgroud)

我想在控制器操作中的登录页面上处理POST命令:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(string returnUrl)
{
    // Authenticate user

    return Redirect(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是如果RawUrl是多个url参数,如"somepage?param1 = 1¶m2 = 2¶m3 = 3",那么传递给Login操作的returnUrl会在第一个&符号之后被截断:"somepage?param1 = 1" .

我尝试过UrlEncoding RawUrl,但这似乎有所不同.看来这里的ASP.NET MVC框架是UrlDecoding url params,然后将它们映射到控制器动作参数,最终剥离了我想在returnUrl参数中看到的其他url参数.

有没有办法解决?我知道我可以使用Request.Path并解析我需要的值,但我想我会先看看是否有更清洁的方法.

Cra*_*ntz 38

您可能错误地编码了链接.是的,它们确实需要编码.我们是这样做的:

<a href="<%= Url.Action("Delete", "TimeRecord", 
    new RouteValueDictionary(new { id = timeRecord.AltId, 
    returnUrl=ViewContext.HttpContext.Request.Url.PathAndQuery }) ) %>">
Run Code Online (Sandbox Code Playgroud)

  • 我不会说你不易受伤害.人们可以用Fiddler等改变表格数据.您仍然需要清理服务器上的URI.另一方面,最好不要使用错误的数据预先填充表单.:) (6认同)
  • 这很好; PathAndQuery不包含域,因此您不容易受到使用您的服务器重定向到其站点的攻击者的攻击. (2认同)

Nic*_*rdi 8

确保在使用之前对RawUrl进行URL编码.

<%= Url.Encode(Request.RawUrl) %>
Run Code Online (Sandbox Code Playgroud)

这应该为你做.