我对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
属性?
答案 0 :(得分:1)
您可以将用户创建/登录添加为单独的操作,这样它就可以具有自定义参数类型。您可以阅读有关OData操作here的信息。例如,用户注册操作的edm可能类似于:
var action = builder.EntityType<User>().Action("Register");
action.Parameter<UserWithPwdDto>("user");
其中User
是控制器的实体类型,其中不包括password属性,而UserWithPwdDto
具有password属性,并且仅由需要该属性的操作使用。
我也希望您在问题中显示的用户类不用作数据库模型,您应该从不将密码以纯文本格式保存在数据库中。