asp.net-mvc-4 - net - login c# sql server mvc
¿Cómo se supone que debo usar ReturnUrl=ViewBag.ReturnUrl en MVC 4? (3)
Estoy trabajando en la aplicación ''ASP.NET MVC 4''. Estoy usando / aprendiendo SimpleMembershipProvider y trato de seguir la lógica predeterminada creada por VS2012
con la Internet template
(si no me equivoco, la que tiene ''SimpleMembershipProvider'' listo para usar).
Estoy atrapado en AccountController
donde simplemente no puedo imaginar cómo exactamente puedo usar este método:
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
Por lo que entiendo, la idea es redirigirme a la ubicación desde la que decidiste iniciar sesión (exactamente lo que quiero lograr). Eché un vistazo a cómo se usa en la vista:
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
Busque un lugar donde ViewBag.ReturnUrl
esté configurado con algún valor y solo tengo este método aquí:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
y estoy bastante confundido acerca de cómo exactamente se supone que debo obtener la ubicación / url. Establecí algunos puntos de interrupción y nunca he visto returnUrl
ser algo diferente de null
que en este escenario me parece bastante lógico ya que no tiene valor en ningún lado (a menos que me pierda algo por supuesto).
Entonces realmente no puedo entender cómo funciona esto. Publiqué lo anterior solo para mostrar que traté de hacer mi tarea, investigué todo lo que pude pero no encontré una respuesta, así que pregunto aquí. ¿Podría dar una explicación / ejemplo sobre cómo funciona esto realmente?
Al usar autenticación de formularios y el usuario no está autenticado o autorizado, la tubería de seguridad de ASP.NET redireccionará a la página de inicio de sesión y pasará como un parámetro en la cadena de consulta returnUrl igual a la página que redirigió a la página de inicio de sesión. La acción de inicio de sesión toma el valor de este parámetro y lo coloca en el ViewBag para que pueda pasarlo a la Vista.
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
La Vista luego almacena este valor en la forma que muestra esta línea de código en la Vista.
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
La razón por la que está almacenada en la Vista es para que cuando el usuario realiza una Envío luego de ingresar su nombre de usuario y contraseña, la acción del controlador que maneja la publicación vuelva a tener acceso a este valor.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
Si el estado del modelo es válido y se autentican llamando al método WebSecurity.Login , llama al método RedirectToLocal con el valor de returnUrl que proviene de la Vista, que originalmente provenía de la acción de inicio de sesión que creó la Vista.
El valor de returnUrl será nulo si el usuario no es redireccionado a la página de inicio de sesión como es el caso cuando simplemente hace clic en el enlace de inicio de sesión en la parte superior de la página en el diseño predeterminado. En este caso, el usuario será redireccionado a la página de inicio después de iniciar sesión correctamente. El propósito de returnUrl es enviar automáticamente al usuario a la página a la que intentaba acceder antes de que se autenticara / autorizara.
Cuando un usuario no autenticado intenta ingresar a una sección de su aplicación que requiere autenticación, entonces returnUrl
entra en la imagen. La URL solicitada por el usuario no autenticado se almacena básicamente en returnUrl
.
Puede seguir el tutorial PluralSight: Creación de aplicaciones con ASP.NET MVC 4
Esto se debe a que la plantilla MVC de ASP.NET predeterminada usa la autenticación de Formularios , y los controladores están decorados con el atributo [Authorize]
:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
[Authorize]
public class AccountController : Controller
{
//...
}
Esto significa que si el usuario no está autenticado, se lo redireccionará a la página de inicio de sesión definida en el atributo LoginUrl del elemento forms.
Durante la redirección, FormsAuthentication
que es un HttpModule
agregará automáticamente la url que se solicitó en la cadena de consulta.
Por lo tanto, si navega a /Account/Login
, no obtendrá nada en la cadena de consulta, ya que está decorado con el atributo [AllowAnonymous]
. Pero si navega a /Account/Manage
notará que returnUrl en la cadena de consulta se convierte en /Account/Manage
(/Account/Login?ReturnUrl=%2fAccount%2fManage)
Así que no está configurando el returnUrl, el framework lo hace por usted, solo lo usa en el AccountController
para saber dónde redirigir al usuario después de que se haya autenticado.