ASP.NET MVC中的ReturnUrl

时间:2009-04-22 18:42:35

标签: asp.net-mvc

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

<a href="/login?ReturnUrl=" + <%= Request.RawUrl %>>Login</a>

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

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

    return Redirect(returnUrl);
}

这里的问题是如果RawUrl是多个url参数,例如“somepage?param1 = 1&amp; param2 = 2&amp; param3 = 3”,那么传递给Login操作的returnUrl会在第一个&符后被截断: “SomePage的?参数1 = 1”。

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

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

3 个答案:

答案 0 :(得分:38)

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

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

答案 1 :(得分:8)

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

<%= Url.Encode(Request.RawUrl) %>

这应该为你做。

答案 2 :(得分:-2)

好的,你的解决方案有味道;我无法将手指放在描述攻击的链接上(它必须是某种类型的会话劫持),但盲目地通过查询字符串重定向会使GOT成为安全漏洞。有人回复或评论信息,请等。

不考虑这方面的安全性方面,一个快速的解决方案是Base64编码整个返回URL。以下是我完全从a blog获得的一些代码,这些代码可能有效,也可能无效:

public static string ToBase64(this HtmlHelper me, string toEncode)
{
      byte[] toEncodeAsBytes
            = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
      string returnValue
            = System.Convert.ToBase64String(toEncodeAsBytes);
      return returnValue;
}

public static string FromBase64(this HtmlHelper me, string encodedData)
{
      byte[] encodedDataAsBytes
          = System.Convert.FromBase64String(encodedData);
      string returnValue =
         System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
      return returnValue;
}