Как использовать JsonIgnore при извлечении данных из базы данных, но не при регистрации или входе в систему, в ASP.NET Ядро (C #)

#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 Я уважаю ваше мнение, но я его не разделяю. Предложение касалось только части, касающейся кодирования. Ответ — это другая часть. Я разделю их. Спасибо.