page - ReturnUrl en ASP.NET MVC
session login asp net mvc (3)
Actualmente tengo un enlace de inicio de sesión en mi aplicación que se parece a esto:
<a href="/login?ReturnUrl=" + <%= Request.RawUrl %>>Login</a>
Quiero manejar el comando POST en la página de inicio de sesión en la acción del controlador a continuación:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(string returnUrl)
{
// Authenticate user
return Redirect(returnUrl);
}
El problema aquí es si RawUrl es algo con múltiples parámetros de url como "somepage? Param1 = 1 & param2 = 2 & param3 = 3", entonces el returnUrl que pasa a la acción de inicio de sesión se trunca después del primer signo: "somepage? Param1 = 1" .
He intentado UrlEncoding the RawUrl pero eso parece hacer alguna diferencia. Parece que el marco MVC de ASP.NET aquí es UrlDecoding los parámetros de URL antes de asignarlos a los parámetros de acción del controlador, lo que termina eliminando los parámetros de URL adicionales que quiero ver en mi parámetro returnUrl.
¿Hay alguna manera de evitar esto? Sé que podría usar Request.Path y analizar los valores que necesito, pero pensé que primero vería si había un enfoque más limpio.
Asegúrese de que su URL codifique RawUrl antes de usarlo.
<%= Url.Encode(Request.RawUrl) %>
Esto debería hacerlo por ti.
De acuerdo, tu solución tiene un olor; No puedo poner mi dedo en un enlace que describa el ataque (tiene que ser un secuestro de sesión de algún tipo), pero redirigir ciegamente a través de una cadena de consulta tiene que ser un agujero de seguridad. Alguien responde o comenta con la información, pls.
Sin pensar en el aspecto de seguridad de esto, una solución rápida sería codificar Base64 a toda la URL de retorno. Aquí hay un código que embauqué completamente de un blog que puede funcionar o no:
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;
}
Probablemente estés codificando los enlaces incorrectamente. Sí, necesitan ser codificados. Así es como lo hacemos:
<a href="<%= Url.Action("Delete", "TimeRecord",
new RouteValueDictionary(new { id = timeRecord.AltId,
returnUrl=ViewContext.HttpContext.Request.Url.PathAndQuery }) ) %>">