En el AccountController
habitual en mi aplicación MVC3, si returnUrl
está configurado (en mi caso, lo configuro manualmente), llamará al Redirect(returnUrl)
.Redirigir (relativeUrl) redireccionando a la ruta incorrecta en IIS
Supongamos que mi URL de retorno es /Admin/HealthCheck
(que realmente es). Cuando estoy depurando, obtengo una URL como http://localhost:3279/Admin/HealthCheck
de la llamada de redirección.
Luego, implementé mi aplicación en http://localhost/Test
. En este caso, Redirect(returnUrl)
me redirige a http://localhost/Admin/HealthCheck
y no el esperado http://localhost/Test/Admin/HealthCheck
.
¿Qué está pasando aquí? ¿Cómo soluciono esto (si es reparable)?
A continuación se muestra un fragmento del MVC3 AccountController (estándar); puede ver dónde obtengo la URL de retorno de la cadena de consulta (por ejemplo, http://localhost/Test/LogOn?ReturnUrl=/Admin/HealthCheck
, aunque codificada en URL).
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
returnUrl = Request.Params["ReturnUrl"];
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
Mi caso está redirigiendo a una página protegida después de iniciar sesión. Por lo tanto, el usuario intenta acceder a una página protegida, obtiene la página de inicio de sesión y debe ser redirigido. ¿Cómo puedo hacer eso? Parece que su enfoque sería almacenar el nombre del controlador, el nombre de la acción y otros parámetros, y usarlo en 'Url.Action'. Eso no parece correcto. – ashes999
@ ashes999, si el usuario intenta acceder a una página protegida, escribe esta dirección de página en la barra de direcciones, ¿no es así? Y cuando su aplicación se implementa en IIS, escribe '/ Test/Admin/HealthCheck' en lugar de'/Admin/HealthCheck', ¿no es así? Porque si él escribiera '/ Admin/HealthCheck' hubiera obtenido un 404 de IIS, ¿no? En este caso, todo funciona como se esperaba. No entiendo cuál es tu problema en realidad. –