Visual Studio "Web API" 项目模板包括用于处理用户注册、身份验证和授权的终结点。但是,在生产应用程序中,用户通常也会与其他实体相关联,例如:
public class Post {
public Post() {};
public int Id { get; set; }
public ApplicationUser User { get; set; }
}
在这些情况下,无法序列化 ApplicationUser
类(派生自 IdentityUser
)。尝试这样做将产生类似于以下内容的错误:
"ObjectContent"1"类型无法序列化内容类型"application/json;charset=utf-8"的响应正文。
我在其他地方看到了类似的问题,建议通过DTO而不是ApplicationUser
对象。但是,这似乎有很多开发人员开销。有没有办法直接序列化ApplicationUser
?
显然,IdentityUser
上有一些属性不应公开给其他用户,例如PasswordHash
。其他(如 Email
和 PhoneNumber
)可能会违反用户隐私预期,具体取决于 API 的身份验证设置。因此,应仔细评估哪些属性是公开的,哪些是未公开的。使用 DTO 可以解决这些问题。
也就是说,没有理由不能通过将DataContractAttribute
添加到继承的类来配置要序列化的IdentityUser
类:
[DataContract]
public class ApplicationUser : IdentityUser {
//...
}
然后,您可以使用以下DataMemberAttribute
显式包含要公开的任何自定义属性:
[DataMember]
public string TwitterHandle { get; set; }
如果您希望公开 UserIdentity
的成员,则需要覆盖它们:
[DataMember]
public override string UserName {
get {
return base.UserName;
}
set {
base.UserName = value;
}
}
最后,值得注意的是,这些属性将与有权访问终结点的任何人共享。如果您想更详细地控制谁可以看到什么,那么将对象包装在 DTO 中将提供这一点。