tutorial net mvc hacer example español como autenticacion asp asp.net-mvc-4 asp.net-mvc-routing simplemembership

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.



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.