C# RESTAPI。隐藏“;密码";现场响应

C# RESTAPI。隐藏“;密码";现场响应,c#,asp.net,mongodb,rest,bson,C#,Asp.net,Mongodb,Rest,Bson,我是C#Net核心的初学者。我使用MongoDB来存储一些对象。为了解释我的问题,假设“UserController”中有两个方法:register和get。 当我使用regeister方法时,我发送用户对象(类似这样的内容): 但是当我使用get方法时,我想隐藏密码字段,我希望得到类似的内容(没有密码): { id: 1, email: "test@test.com", name: "GoodUserName" } 我试着用Bs

我是C#Net核心的初学者。我使用MongoDB来存储一些对象。为了解释我的问题,假设“UserController”中有两个方法:register和get。 当我使用regeister方法时,我发送用户对象(类似这样的内容):

但是当我使用get方法时,我想隐藏密码字段,我希望得到类似的内容(没有密码):

{
    id: 1,
    email: "test@test.com",
    name: "GoodUserName"
}
我试着用BsonIgnore

Class User 
{
    ...
    [BsonIgnore]
    string password {get; set;}
    ...
}
但当我使用register方法时,密码字段是空的。
我的问题是,当我使用“get”控制器时,响应中的“User”对象包括password字段。请告诉我在响应时隐藏密码的最佳实践方法。

解决问题的简单方法是在检索用户时使用排除投影排除密码属性,如下所示:

var projection=Builders.projection.Exclude(u=>u.password);
var user=(等待userCollection.FindAsync(
过滤器:u=>u.id==1,
选项:新FindOptions{Projection=Projection})
).SingleOrDefaultAsync();

但是。。。理想情况下,您永远不会希望像这样向前端公开数据模型/实体。您应该使用单独的视图模型或DTO,并在域实体之间进行映射。查找CQRS模式以获得良好的实现。

通常,您会有“数据传输对象(DTO)”并将这些对象映射到数据库对象(有时称为“实体”)。通过这种方式,您可以控制要隐藏(或添加)的信息。顺便说一句:我猜(并希望)这不是生产代码。您确实不应该将纯文本密码保存到db中(但这对于一系列讲座来说已经足够了)。在将对象返回到客户端之前,您可以轻松地在代码中清空密码字段^^^对于映射,甚至还有一些库可以简化这一过程(如“避免编写样板代码”):如Mapster,AutoMapper…为什么不使用.net标识?这为您处理了很多问题,并且仍然是可定制的。对于core,您可以在此处查看它是什么:
Class User 
{
    ...
    [BsonIgnore]
    string password {get; set;}
    ...
}