【问题标题】:How do I serialize an IdentityUser reference in Web API 2.2?如何在 Web API 2.2 中序列化 IdentityUser 引用?
【发布时间】:2015-07-11 20:55:44
【问题描述】:

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

【问题讨论】:

标签: c# serialization entity-framework-6 asp.net-web-api2 asp.net-identity


【解决方案1】:

显然,IdentityUser 上有一些属性不应该向其他用户公开,例如PasswordHash。其他人,例如 EmailPhoneNumber 可能会违反用户隐私期望,具体取决于您的 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 中即可。

【讨论】:

  • 我无法通过添加 [DataContract][DataMember] 属性来序列化用户。可能,使其工作的唯一方法是创建一个单独的 DTO 类。
  • 我在这里找到了另一个使用匿名类型的解决方案:stackoverflow.com/a/658056/3731444
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2014-04-27
  • 2011-12-21
  • 2017-08-30
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多