Implementación de la función “Recordarme” en ASP.NET MVC

Estoy intentando implementar una función de “recordarme” en mi formulario de inicio de sesión. Estoy usando ASP.NET MVC como mi aplicación web. Me las arreglé para hacer que las cookies funcionaran, pero no logré iniciar sesión automáticamente en caso de que haya marcado la casilla “Recordarme” antes. Sé cuál es el problema, pero no sé cómo resolverlo.

En mi HomeController tengo lo siguiente:

private LoginViewModel CheckLoginCookie() { if (!string.IsNullOrEmpty(_appCookies.Email) && !string.IsNullOrEmpty(_appCookies.Password)) { var login = new LoginViewModel { Email = _appCookies.Email, Password = _appCookies.Password }; return login; } return null; } public ActionResult Index() { var login = CheckLoginCookie(); if (login != null) return RedirectToAction("Login", "User", login); var viewModel = new HomeIndexViewModel { IntroText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.", LastMinuteDeals = new List(), TrustedDeals = new List() }; return View(viewModel); } 

Y en mi UserController, tengo el método de acción de inicio de sesión:

 public ActionResult Login() { return PartialView(new LoginViewModel()); } [HttpPost] public ActionResult Login(LoginViewModel dto) { bool flag = false; if (ModelState.IsValid) { if (_userService.AuthenticateUser(dto.Email, dto.Password, false)) { var user = _userService.GetUserByEmail(dto.Email); var uSession = new UserSession { ID = user.Id, Nickname = user.Nickname }; SessionManager.RegisterSession(SessionKeys.User, uSession); flag = true; if(dto.RememberMe) { _appCookies.Email = dto.Email; _appCookies.Password = dto.Password; } } } if (flag) return RedirectToAction("Index", "Home"); else { ViewData.Add("InvalidLogin", "The login info you provided were incorrect."); return View(dto); } } 

Básicamente, lo que pensé que haría es redirigir al usuario desde el resultado de la acción Índice en el controlador del hogar en caso de que hubiera una cookie de inicio de sesión. Pero el problema es que RedirectToAction activará el método de acción GET Login y no el POST que se encarga de iniciar sesión en el usuario.

¿Me estoy equivocando completamente sobre esto? ¿O hay alguna manera de llamar al método de inicio de sesión POST usando RedirectToAction o de otra forma?

    En primer lugar, nunca debe almacenar las credenciales del usuario en una cookie. Es increíblemente inseguro. La contraseña se pasará con cada solicitud y se almacenará en texto sin formato en la máquina del usuario.

    Segundo, no reinvente la rueda, especialmente cuando se trata de seguridad, nunca lo hará bien.

    ASP.Net ya proporciona esta funcionalidad de forma segura con Autenticación de formularios y Proveedores de membresía. Deberías echarle un vistazo a eso. La creación de un proyecto MVC predeterminado incluirá la configuración de autenticación básica. El sitio oficial de MVC tiene más.

    Actualizar

    Aún puede usar la autenticación de formularios .NET sin implementar un proveedor de membresía. En un nivel básico, funcionaría así.

    Habilita la autenticación de formularios en su web.config

        

    Decora las acciones o los controladores que desea asegurar con el atributo [Authorize] .

     [Authorize] public ViewResult Index() { //you action logic here } 

    Luego crea una acción de inicio de sesión básica

     [HttpPost] public ActionResult Login(LoginViewModel dto) { //you authorisation logic here if (userAutherised) { //create the authentication ticket var authTicket = new FormsAuthenticationTicket( 1, userId, //user id DateTime.Now, DateTime.Now.AddMinutes(20), // expiry rememberMe, //true to remember "", //roles "/" ); //encrypt the ticket and add it to a cookie HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket)); Response.Cookies.Add(cookie); return RedirectToAction("Index"); } }