C# 如何序列化Web API 2.2中的IdentityUser引用?

C# 如何序列化Web API 2.2中的IdentityUser引用?,c#,serialization,entity-framework-6,asp.net-web-api2,asp.net-identity,C#,Serialization,Entity Framework 6,Asp.net Web Api2,Asp.net Identity,VisualStudioWebAPI项目模板包括用于处理用户注册、身份验证和授权的端点。但是,在生产应用程序中,用户通常也会与其他实体关联,例如: 公营职位{ 公共邮政{}; 公共int Id{get;set;} 公共应用程序用户{get;set;} } 在这些场景中,无法序列化从IdentityUser派生的ApplicationUser类。尝试这样做将产生类似以下错误: 'ObjectContent'1'类型未能序列化'application/json'内容类型的响应正文;字符集=utf-8

VisualStudioWebAPI项目模板包括用于处理用户注册、身份验证和授权的端点。但是,在生产应用程序中,用户通常也会与其他实体关联,例如:

公营职位{ 公共邮政{}; 公共int Id{get;set;} 公共应用程序用户{get;set;} } 在这些场景中,无法序列化从IdentityUser派生的ApplicationUser类。尝试这样做将产生类似以下错误:

'ObjectContent'1'类型未能序列化'application/json'内容类型的响应正文;字符集=utf-8'


我在其他地方看到过类似的问题,建议传递DTO而不是ApplicationUser对象。然而,这似乎是开发人员的大量开销。没有直接序列化ApplicationUser的方法吗?

显然,IdentityUser上有一些属性不应该公开给其他用户,例如PasswordHash。根据API的身份验证设置,电子邮件和电话号码等其他内容可能会违反用户隐私期望。因此,应仔细评估哪些特性暴露在外,哪些特性未暴露在外。使用DTO解决这些问题

也就是说,没有理由不能通过将DataContractAttribute添加到继承的类来配置要序列化的IdentityUser类:

[DataContract] 
public class ApplicationUser : IdentityUser {
  //...
}
然后,您可以使用DataMemberAttribute显式包含任何要公开的自定义属性:

如果希望公开UserIdentity的成员,则需要覆盖它们:

[DataMember]
public override string UserName {
  get {
    return base.UserName;
  }
  set {
    base.UserName = value;
  }
}

最后,值得注意的是,这些属性将与任何有权访问端点的人共享。如果您想更详细地控制谁看到了什么,那么将对象包装到DTO中将提供这一点。

我无法通过添加[DataContract]和[DataMember]属性来序列化用户。也许,使其工作的唯一方法是创建一个单独的DTO类
[DataMember]
public override string UserName {
  get {
    return base.UserName;
  }
  set {
    base.UserName = value;
  }
}