Реализация функции "Запомнить меня" в ASP.NET MVC

Я пытаюсь реализовать функцию "Запомнить меня" в моей форме входа в систему. Я использую ASP.NET MVC как мое веб-приложение. Мне удалось заставить файл cookie работать, но я не смог автоматически войти в систему пользователя, если он/она проверил флажок Запомнить меня раньше. Я знаю в чем проблема но не знаю как ее решить.

в моем HomeController у меня есть следующие:

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<ItemsIndexViewModel>(),
                            TrustedDeals = new List<ItemsIndexViewModel>()
                        };
    return View(viewModel);
}

и в моем UserController у меня есть действие входа метод:

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);
    }
}

Итак, в основном, я думал, что я сделаю, это перенаправить пользователя из результата действия индекса на домашний контроллер в случае, если был файл cookie входа. Но проблема в том, что RedirectToAction вызовет метод действия GET Login, а не сообщение, которое заботится о регистрации пользователя.

Я полностью ошибаюсь? Или есть какой-то способ вызвать метод POST Login с помощью RedirectToAction или любым другим способом?

1 ответов


во-первых, вы никогда не должны хранить учетные данные пользователя в куки. Это невероятно небезопасно. Пароль будет передаваться с каждым запросом, а также храниться в виде обычного текста на компьютере пользователя.

во-вторых, не изобретать колесо, особенно, когда речь идет о безопасности, вы никогда не получите это право.

ASP.Net уже обеспечивает эту функциональность безопасно с формами Authenitcation и поставщиками членства. Тебе стоит взглянуть на это. Творящий проект MVC по умолчанию будет включать базовую настройку проверки подлинности. Чиновник сайт MVC больше.

обновление

вы все еще можете использовать проверку подлинности .NET forms без реализации поставщика членства. На базовом уровне это будет работать так.

включить проверку подлинности форм в интернете.config

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

вы украшаете действия или контроллеры, которые вы хотели бы обеспечить с помощью [Authorize] атрибут.

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

затем создайте базовое действие входа

[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");

  }

}