Где бы я мог хэшировать пароль asp.net используя mvc4 и EF?
Поэтому у меня есть некоторые модели, отображаемые в представлении по умолчанию. Я пытаюсь понять, хочу ли я хэшировать пароль с помощью крипто.Метод HashPassword (). Делаю ли я это в контроллере или модели, или где? Я исследовал, как это сделать, но я просто нахожу другой метод, а не то, где происходит действие. Новичок в MVC и asp.net, так что любая точка в правильном направлении будет главным подспорьем. Заранее спасибо.
3 ответа:
Я бы определил класс пользователя следующим образом:
public class User { private string PasswordHash {get; set;} //assuming your db supports serializing private properties. If not increase visibility as necessary. public void SetPassword(string newPassword) { PasswordHash = PasswordHasher.CreateHash(newPassword); } public bool VerifyPassword(string passwordCandidate) { return PasswordHasher.Verify(PasswordHash, passwordCandidate); } }
У меня не было бы свойства
User.Password
, так как вы никогда не храните его, и нет простого сопоставления между паролями и хэшами.Свойство
PasswordHash
должно быть доступно только сериализатору базы данных и через эти две функции. Контроллер должен получить пользователя, а затем вызвать эти методы для проверки / изменения пароля.
Я также рекомендую использовать пользовательский хэшер с аналогичным API классу
Crypto
.Crypto
имеет жестко заданное число итераций с довольно малым значением.
Обычно требуется выполнить операцию хэширования в контроллере и сохранить значение результата хэширования в модели .
Возьмем для примера простой вход пользователя на ваш сайт:
- когда учетная запись пользователя будет создана впервые, вы вызовете Crypto.HashPassword (pwd) для вычисления хэш-значения пароля, установленного пользователем. Вы можете сделать это в контроллере, внутри действия, где пользователь регистрирует новый счет.
Полученное хэш-значение необходимо сохранить в модели (например, в БД), чтобы вы могли получить его позже.- когда тот же пользователь попытается войти в систему в следующий раз, вам нужно будет вызвать Crypto.VerifyHashedPassword (storedHash, submittedPwd). Класс Crypto хэширует представленный pwd с теми же IV и Salt и возвращает True, если они совпадают (pwd правильно), или False, если они не совпадают (pwd неправильно).
Если вы новичок в MVC и ASP.Net, вы можете посмотреть на ASP.Net аутентификация с помощью форм (например, Эта страница на MSDN ), которую можно использовать для аутентификации пользователей без необходимости откатывать собственное пользовательское решение.
Существует множество способов сделать это..
В идеале я бы отметил свойство password именем пользовательского атрибута [Encrypt (true)]. Поэтому, когда свойство сохраняется в базе данных, вы должны отслеживать свойство models, которое помечено атрибутом Encrypt отдельно (внутри события сохранения DbContext). Затем вы можете зашифровать его и сохранить в базе данных внутри указанного события сохранения.
Пользовательский атрибут и универсальное решение, подобное этому, могут пригодиться, когда вы захотите шифруйте любые другие конфиденциальные данные,которые вы хотите сохранить в своей базе данных позже.