如何在不丢失 POST 方法的情况下正确排除 Odata 中的密码 属性

How to properly exclude password property in Odata without loosing POST method

我对 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 排除在外。 其中之一是在 return 上将其设置为 null,我认为这感觉不对,因为该字段被标记为 Required 并且 returning null 只是感觉不对。

更常见的一种是在EDM模型中忽略它。但是该解决方案存在一个问题,即 POST 方法将不再接收创建 User 所需的所有数据。

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

用户如何在不指定密码的情况下登录? 我觉得从 EDM 模型中排除密码也不是正确的方法。

理想的解决方案是使用两个 DTO's 来分隔 UserInitiator 数据结构(这将包括密码 属性 但没有其他一些属性,例如 idUserInfo 将包含所有 'safe to read' 数据。不幸的是,OData 似乎不允许这样的分离。

那么,我应该如何正确处理 password 属性?

您可以将用户 creation/login 添加为单独的操作,这样它就可以拥有自定义参数类型。您可以阅读有关 OData 操作的信息 here。例如,用户注册操作的 edm 可能类似于:

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

其中 User 是不包含密码 属性 的控制器的实体类型,而 UserWithPwdDto 有密码 属性 并且仅由需要 属性.

的操作

另外我希望你在问题中显示的用户 class 没有被用作你的数据库模型,你应该 永远不要 将密码保存为 plain-text你的数据库。