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

时间:2019-07-06 18:44:22

标签: c# odata dto

我对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 个答案:

答案 0 :(得分:1)

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

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

其中User是控制器的实体类型,其中不包括password属性,而UserWithPwdDto具有password属性,并且仅由需要该属性的操作使用。

我也希望您在问题中显示的用户类不用作数据库模型,您应该从不将密码以纯文本格式保存在数据库中。