带有/ Url编码问题的.NET MVC路由

时间:2011-08-29 02:35:57

标签: asp.net-mvc-3 routing url-encoding

我有以下路由代码:

routes.MapRoute(
            "email-validated/{sessionId}",
            "email-validated/{sessionId}",
            new { controller = "User", action = "EmailValidated", sessionId = UrlParameter.Optional }
            );

当我点击路径w / url编码的东西时,它将与%2f,%2b和其他一些转义字符的路由不匹配。它也不匹配非url编码(事物w / +等)例如

这有效:

  

电子邮件验证/ XQiKC6KMM%2cmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

这不起作用(包含%2f等):

email-validated/XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

这不起作用(包含+ etc)

email-validated/XQiKC6KMM+mko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

4 个答案:

答案 0 :(得分:7)

如果可以,您需要安全地使用sessionId网址。 sessionId是Base64编码的,Base64中有三个URL问题字符,“/”,“+”和“=”。创建链接时,请使用以下内容对sessionId进行编码:

    public string ToUrlSafeBase64String(string Base64String)
    {
        // avoid any slashes, plus signs or equal signs
        // the following makes this base64 string url safe
        Base64String = Base64String.Replace("/", "_");
        Base64String = Base64String.Replace("+", "-");
        return Base64String.Replace("=", String.Empty);
    }

然后,使用以下命令重新创建原始Base64编码的字符串:

    public string FromUrlSafeBase64String(string Base64String)
    {
        // add back any slashes, plus signs or equal signs
        // the following makes this url safe string a base64 string
        Base64String = Base64String.Replace("_", "/");
        Base64String = Base64String.Replace( "-", "+");
        return Base64String.PadRight(Base64String.Length + (4 - Base64String.Length % 4) % 4, '=');
    }

答案 1 :(得分:3)

看起来路由路径很奇怪地处理了转义/和's'。尝试将其作为查询字符串参数传递。

制作您的终端:

routes.MapRoute(
            "email-validated",
            "email-validated",
            new { controller = "User", action = "EmailValidated" }
            );

使用以下请求调用它:

email-validated/?sessionId=XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

然后从

更改您的功能
EmailValidatedFunction(string sessionId)
{
   //...do stuff with sessionId here
}

为:

EmailValidatedFunction()
{
   string sessionId = Request["sessionId"];
   //...do stuff with sessionId here
}

答案 2 :(得分:0)

这是我发现的解决方案,允许在Asp.Net MVC网址中使用url编码的字符,例如正斜杠%2f

将以下内容添加到Application_BeginRequest文件的Global.asax方法中:

var realUrl = Request.ServerVariables["HTTP_URL"];
Context.RewritePath(realUrl);

由于这发生在MVC路由之前,您将能够执行您最初想要做的事情。

请记住,您需要手动解码操作方法中的参数以获取其实际值(因为我们正在阻止框架这样做)。

答案 3 :(得分:0)

你可以使用System.Web.HttpServerUtility.UrlTokenEncode(来自http://brockallen.com/2014/10/17/base64url-encoding/#comments