ASP.NET MVC4 Помните пароль для входа, используя куки - Безопасный способ? - PullRequest
1 голос
/ 23 марта 2012

Хотелось бы, чтобы в поле для входа автоматически вводились имя пользователя и пароль, если пользователь ранее был на сайте и ранее успешно входил в систему. Я вижу, что это реализовано на многих сайтах, поэтому я нашел способ сделать это, не создавая угрозы безопасности.

РЕДАКТИРОВАТЬ: Согласно сообщению, это функция браузера и не должна быть реализована в коде, потому что никогда не безопасно хранить пароль в любом месте.

Отредактировал код, чтобы отразить новое направление, в котором я сохраняю только имя пользователя. Тем не менее, я не уверен, что искать, чтобы увидеть, если он работает. Я попытался войти в систему, затем выйти из системы, затем снова перейти к экрану входа в систему, но поле имени пользователя остается пустым, когда загружается представление. Не уверен, что это код или я проверяю его неверным способом.

Логин POST:

        [HttpPost]
    public ActionResult Login(LoginModel model)
    {

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);                    
                return Json(new { ok = true, message = "Login successful." });
            }
        }

        return Json(new { ok = false, message = "The username or password you entered is invalid. Please try again." });
    }

Логин GET:

[HttpGet]
    public ActionResult Login(string path)
    {
        LoginModel model = new LoginModel();

        HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName.ToString()];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket != null & !authTicket.Expired)
            {
                model.UserName = authTicket.UserData;
            }
        }

        return PartialView(path, model);
    }

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Есть несколько проблем с вашим кодом.Во-первых, вы добавляете cookie в объект Request вместо того, чтобы добавлять его в Response => Response.Cookies.Add(authCookie);.

Вторая проблема заключается в том, что вы создаете непостоянный cookie, что означает, что он будеттолько жить через сеанс браузера.Как только пользователь закроет браузер, он исчезнет навсегда, поскольку он никогда не сохранялся на клиентском компьютере.Чтобы создать постоянный файл cookie , необходимо указать для него дату окончания срока действия, которая, очевидно, будет соответствовать продолжительности сохранения этого файла cookie на клиентском компьютере.Например, если вы хотите запомнить в течение 5 дней:

HttpCookie authCookie = new HttpCookie("authCookie", "cookieValue")
{
    Expires = DateTime.Now.AddDays(5)
};

Другая проблема заключается в том, что вы храните в куки только хеш-пароль MD5 и ожидаете, что сможете расшифровать его позже с помощью FormsAuthentication.Decrypt что невозможно.Этот метод может расшифровывать значения, которые были зашифрованы с помощью метода Encrypt.

И самая большая проблема из них - это безопасность: вы никогда не должны хранить какие-либо вещи, связанные с паролями.Имя пользователя должно быть достаточно.Браузеры предлагают возможность запоминать пароли для данного сайта.Я бы порекомендовал вам использовать эту функцию вместо того, чтобы делать то, что вы делаете.

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

0 голосов
/ 23 марта 2012

Если вы используете SQL, вы можете сгенерировать случайное число при первом входе пользователя в систему. Сохраните этот номер в таблице «Пользователи», а также в виде файла «cookie» на компьютере пользователя. Затем пользователь может аутентифицироваться, сравнивая случайное число с тем, которое хранится на сервере.

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

0 голосов
/ 23 марта 2012

вам не нужен фактический пароль, чтобы пользователь мог убедиться, что он вошел в систему ранее.Вы даже не должны сохранять действительный пароль в базе данных.Вы обычно сохраняете соленый хеш этого пароля.Когда пользователь входит в систему, вы создаете хеш для этого пароля и сравниваете его с хешем, хранящимся в базе данных.Если они совпадают, он вводит правильный пароль.

Что касается хранения информации для входа в cookie, я бы затем сохранял соленый хэш этого хэша пароля в cookie.Получив GET, вы просто создаете соленый хэш сохраненного хэша пароля и сравниваете его с файлом из куки.Если они совпадают, логин cookie действителен.Таким образом, вы никогда нигде не храните пароль пользователя.

Чтобы сделать это более безопасным, страница входа должна быть защищена с помощью SSL, в противном случае пароль будет хотя бы один раз передан незашифрованным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...