Реализация функции "Запомнить меня" в 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, который заботится о входе пользователя в систему.
Я полностью ошибаюсь по этому поводу? Или есть какой-то способ, которым я мог бы вызвать метод POST Login, используя RedirectToAction или любым другим способом?
1 ответ
Во-первых, вы никогда не должны хранить учетные данные пользователя в cookie. Это невероятно небезопасно. Пароль будет передаваться при каждом запросе, а также храниться в виде простого текста на компьютере пользователя.
Во-вторых, не изобретайте велосипед, особенно когда речь идет о безопасности, вы никогда не получите это правильно.
ASP.Net уже обеспечивает эту функциональность надежно с провайдерами проверки подлинности форм и членства. Вы должны взглянуть на это. Создание проекта MVC по умолчанию будет включать базовую настройку аутентификации. Официальный сайт MVC имеет больше.
Обновить
Вы по-прежнему можете использовать проверку подлинности форм.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");
}
}