在WebAPI中公开ApplicationUser

时间:2013-10-22 05:32:28

标签: c# asp.net asp.net-web-api asp.net-mvc-5 asp.net-identity

我希望能够使用WebAPI 2公开用户列表。但是,由于我在MVC5中使用新的Asp.Net身份验证框架,我似乎无法找到仅将特定字段标记为{的方法{1}}。

继承我所拥有的:

DataMembers

但是,这似乎不起作用,因为[DataContract] public class ApplicationUser : IdentityUser { public Nullable<DateTime> birthday { get; set; } [DataMember] public int tolerance { get; set; } [DataMember] public string twitter { get; set; } } 没有IdentityUser属性。我已尝试创建自定义[DataContract],但在创建IdentityUser的自定义副本后,我无法构建。

这里有任何提示或解决方法吗?我不想创建一个ViewModel,除非这是当前的最佳实践。

3 个答案:

答案 0 :(得分:2)

您可能应该使用您需要的用户信息发送不同的对象,而不是序列化用户对象。

答案 1 :(得分:2)

我知道这是一个老问题,当我试图达到同样的目的时,我偶然发现了它。这就是我最终做的事情。您可以覆盖您的属性并将其标记为[JsonIgnore],以便它们不会自动序列化。

public class ApplicationUser : IdentityUser
    {
        public UserType UserType { get; set; }

        [JsonIgnore]
        public override string PasswordHash
        {
            get { return base.PasswordHash; }
            set { base.PasswordHash = value; }
        }
    }

答案 2 :(得分:1)

您想使用哪种格式化程序?我没有看到默认的Json格式化程序有任何问题。但对于xml序列化程序,它还需要基类为DataContract。

视图模型始终是最佳实践,尽管为了简单起见,web api的大多数示例都使用数据实体。这两个模型是各自关注的问题。 View模型代表api的合约,数据模型代表您的域概念。将两个模型合二为一会影响您的设计决策,甚至更严重,可能会导致安全问题。使用数据实体可能会将意外数据暴露给用户。例如,不同的格式化程序具有不同的规则来控制模型的曝光。 JsonIgnore在xml格式化程序中不起作用。如果你有自定义格式化程序会更复杂。特别是对于身份用户实体,它具有许多敏感属性,如pasword hash,security stamp。我不建议你公开它。

BTW,有许多映射器工具可以帮助简化从域模型到视图模型的映射。您可能需要它们:http://www.nuget.org/packages?q=mapper