Как правильно исключить свойство пароля в Odata без потери метода POST - PullRequest
0 голосов
/ 06 июля 2019

Я немного запутался в структуре сущностей OData.Давайте рассмотрим пример пользовательской сущности:

public class User {
   [Required]
   public string Name;
   [Required]
   public string Surname;
   [Required]
   public string Password;
}

И затем мы добавим его в модель EDM:

var type = builder.AddEntityType(typeof(User));
builder.AddEntitySet("Users", type);

Достаточно справедливо, но ... Конечно, мы не хотим показыватьPassword.К счастью, существует множество способов исключить password из воздействия.Один из них - просто установить его на null по возвращении, что, на мой взгляд, неверно, поскольку поле помечено как Required, а возвращение null просто кажется неправильным.

Более распространенным является игнорированиеэто в модели EDM.Но есть проблема с этим решением, а именно метод POST больше не будет получать все данные, необходимые для создания User.

public ActionResult<User> Post([FromBody] User user)
{
 // user missing password

Как пользователь должен войти в систему без указания пароля?Я чувствую, что исключение пароля из модели EDM также не является правильным способом сделать это.

Идеальным решением было бы использование двух DTO's, которые бы разделяли UserInitiator структуру данных (которая включала бы свойство пароля, ноне имеют некоторых других свойств, таких как id) и UserInfo, которые будут содержать все данные, «безопасные для чтения».К сожалению, OData не позволяет такое разделение.

Итак, как мне правильно обрабатывать свойство password?

1 Ответ

1 голос
/ 08 июля 2019

Вы можете добавить создание пользователя / вход в систему как отдельное действие, чтобы он мог иметь пользовательский тип параметра. Вы можете прочитать о действиях OData здесь . Например, edm для действия регистрации пользователя может выглядеть примерно так:

var action = builder.EntityType<User>().Action("Register");
action.Parameter<UserWithPwdDto>("user");

Где User - это тип объекта контроллера, который не включает свойство пароля, а UserWithPwdDto имеет свойство пароля и используется только действиями, для которых требуется это свойство.

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

...