Где бы я мог хэшировать пароль asp.net используя mvc4 и EF?


Поэтому у меня есть некоторые модели, отображаемые в представлении по умолчанию. Я пытаюсь понять, хочу ли я хэшировать пароль с помощью крипто.Метод HashPassword (). Делаю ли я это в контроллере или модели, или где? Я исследовал, как это сделать, но я просто нахожу другой метод, а не то, где происходит действие. Новичок в MVC и asp.net, так что любая точка в правильном направлении будет главным подспорьем. Заранее спасибо.

3 3

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). Затем вы можете зашифровать его и сохранить в базе данных внутри указанного события сохранения.

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