ReturnUrl в 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 & param2 = 2 & param3 = 3", тогда возвращаемый url, который передается в действие Login, усекается после первого амперсанда: "somepage? param1 = 1".
Я пробовал UrlEncoding RawUrl, но, похоже, имеет значение. Кажется, что инфраструктура ASP.NET MVC здесь UrlDecoding params url, прежде чем сопоставлять их с параметрами действия контроллера, что заканчивает отмену дополнительных параметров url, которые я хочу увидеть в моем параметре returnUrl.
Есть ли способ обойти это? Я знаю, что могу просто использовать Request.Path и проанализировать нужные мне значения, но я подумал, что сначала посмотрю, был ли более чистый подход.
Ответы
Ответ 1
Вероятно, вы неправильно кодируете ссылки. Да, они должны быть закодированы. Вот как мы это делаем:
<a href="<%= Url.Action("Delete", "TimeRecord",
new RouteValueDictionary(new { id = timeRecord.AltId,
returnUrl=ViewContext.HttpContext.Request.Url.PathAndQuery }) ) %>">
Ответ 2
Перед использованием убедитесь, что URL-адрес закодирован RawUrl.
<%= Url.Encode(Request.RawUrl) %>
Это должно сделать это за вас.
Ответ 3
Хорошо, ваше решение имеет запах; Я не могу поместить палец на ссылку, описывающую атаку (она должна быть какой-то захватной сессией), но слепо перенаправление через querystring имеет GOT, чтобы быть дырой в безопасности. Кто-то отвечает или комментирует информацию, PLS.
Не задумываясь об аспекте безопасности, одним быстрым решением будет Base64 кодировать весь URL-адрес возврата. Здесь некоторый код, который я полностью скрывал от блог, который может работать или не работать:
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;
}