#c#
#c#
Вопрос:
Чтобы предотвратить отображение пароля при извлечении пользователя из базы данных, я использую атрибут JsonIgnore, и он отлично работает для зарегистрированного пользователя, но не позволяет зарегистрировать нового пользователя или войти в систему другого пользователя. Как использовать JsonIgnore для работы при извлечении данных из базы данных, но не при регистрации или входе в систему, в ASP.NET Core (C#)
?
Это моя пользовательская модель:
public class UserModel
{
[Key]
public int Id { get; set; }
[Column(TypeName ="nvarchar (30)")]
public string Name { get; set; }
[Column(TypeName ="nvarchar (100)")]
[JsonIgnore]
public string Password { get; set; }
}
Комментарии:
1. Почему ваш класс базы данных должен использовать атрибут [JsonIgnore]? Используете ли вы одни и те же классы для своей базы данных и REST API?
2. Не используйте JsonIgnore. Просто назначьте пароль = null перед отправкой, когда он вам не нужен.
3. Это не то, что
JsonIgnore
делает. На самом деле, нет абсолютно никакой причины даже иметьPassword
свойство вUser
объекте. Пароли никогда не хранятся в виде открытого текста, они обрабатываются и хэшируются не менее 1000 раз. Код аутентификации никогда не должен знать даже это значение, ему нужно только хэшировать ввод пользователя и сравнивать его с сохраненным значением. Нет причин извлекать хэш пароля из базы данных4. Кроме того, я надеюсь, что «Пароль» — это сокращение от PasswordHash, верно?
5. Почему вы создаете свой собственный
User
и аутентификацию вместо использования встроенного ASP.NET Основная идентичность? Он уже обрабатывает безопасное хранение паролей, сравнение, изменение и т. Д. Все ASP.NET версии, начиная с 2002 года, включали безопасную аутентификацию и пользовательское хранилище
Ответ №1:
Никогда не извлекайте пароль из базы данных, даже когда вы его проверяете. Вы должны «выполнить поиск» пользователя с этим паролем и получить идентификатор или другие данные, если они существуют. Вы никогда не должны этого делать.
Предложение:
Более того, ваш пароль должен быть зашифрован одним из способов с SHA-256
помощью or SHA-512
и сохранен в другой таблице, которая не вызывает «пароли» или связанные с этим поля. Также никогда не делайте « select *
» даже как «выбрать все поля», если вы не будете использовать их в этой бизнес-логике. Чем меньше, тем больше.
Комментарии:
1. Простое хеширование бессмысленно. По крайней мере, пароль должен быть изменен и хэширован несколько раз (ASP.NET Значение ядра по умолчанию составляет не менее 1000 раз), чтобы гарантировать, что оно не может быть подвергнуто обратному проектированию. В противном случае можно было бы вычислить хэши SHA512 на лету и сравнить их с сохраненными хэшами, пока не будет найдено совпадение
2. .NET использует Rfc2898DeriveBytes для соли и хэширования не менее 1000 раз, используя HMACSHA1, алгоритм, разработанный для хэширования ключей. Алгоритм может быть изменен с помощью HMACSHA256 и -512, доступных из коробки.
3. @PanagiotisKanavos я понимаю. Это пример наблюдения и предложения для тех, кто является новичком и учится. Конечно, у меня нет опыта, чтобы объяснить это новичку. и в этом ответе недостаточно места, чтобы все объяснить.
4. Тогда вы должны были опубликовать это в качестве комментария
5. @PanagiotisKanavos Я уважаю ваше мнение, но я его не разделяю. Предложение касалось только части, касающейся кодирования. Ответ — это другая часть. Я разделю их. Спасибо.