我有以下路由代码:
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
答案 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)