Подтвердить что ты не робот

Реализация функции "Запомнить меня" в 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 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 у меня есть метод действия Login:

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, который заботится о регистрации в пользователе.

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

4b9b3361

Ответ 1

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

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

ASP.Net уже надежно защищает эту функцию с помощью Autodesk Forms Authentication and Membership Providers. Вы должны взглянуть на это. Создание проекта MVC по умолчанию будет включать базовую настройку проверки подлинности. Официальный сайт MVC имеет больше.

Update

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

Вы разрешаете проверку подлинности на вашем компьютере. web.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");

  }

}