如何在 Web API 2.2 中序列化标识用户引用



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。其他(如 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 中将提供这一点。

相关内容

  • 没有找到相关文章

最新更新