C# Microsoft.AspNet.Identity可以';定义一个INT主键?

C# Microsoft.AspNet.Identity可以';定义一个INT主键?,c#,asp.net-mvc,C#,Asp.net Mvc,我使用Asp.net标识创建我的成员资格模块遵循本教程,然后我注意到我无法定义INT类型主键,因为用户模型应该继承IdentityUser,而在IdentityUser类中定义的Id属性是字符串类型,如此,如何解决 namespace Microsoft.AspNet.Identity.EntityFramework { public class IdentityUser : IUser { public IdentityUser(); publi

我使用Asp.net标识创建我的成员资格模块遵循本教程,然后我注意到我无法定义INT类型主键,因为用户模型应该继承IdentityUser,而在IdentityUser类中定义的Id属性是字符串类型,如此,如何解决

namespace Microsoft.AspNet.Identity.EntityFramework
{
    public class IdentityUser : IUser
    {
        public IdentityUser();
        public IdentityUser(string userName);

        public virtual ICollection<IdentityUserClaim> Claims { get; }
        **public virtual string Id { get; set; }**
        public virtual ICollection<IdentityUserLogin> Logins { get; }
        public virtual string PasswordHash { get; set; }
        public virtual ICollection<IdentityUserRole> Roles { get; }
        public virtual string SecurityStamp { get; set; }
        public virtual string UserName { get; set; }
    }
}
名称空间Microsoft.AspNet.Identity.EntityFramework
{
公共类标识用户:IUser
{
公共身份识别器();
公共标识用户(字符串用户名);
公共虚拟ICollection声明{get;}
**公共虚拟字符串Id{get;set;}**
公共虚拟ICollection登录名{get;}
公共虚拟字符串密码哈希{get;set;}
公共虚拟ICollection角色{get;}
公共虚拟字符串SecurityStamp{get;set;}
公共虚拟字符串用户名{get;set;}
}
}

您不能使用默认成员资格提供程序更改
标识用户的基本ID
。您将不得不推出自己的
IUser
实施和存储

这里有一个很好的话题,讨论如何创建自己的实现

既然如此(在我个人看来[停止争论
int
vs
uniqueidentifier
用于主键存储和索引]),UserID(
Id
)属性的标识是比整数更好的唯一用户Id。尽管该类是以字符串形式实现的,但其底层类型是基于一个比ID更难欺骗的字符串(见答案底部的附录1)。顺序用户ID使某人在了解如何定位其他用户以及可能绕过应用程序安全性方面占了上风。不,我手边没有例子,只是闻起来不舒服

如果您不想滚动自己的应用程序,并且可以调整您的应用程序,我建议您向
ApplicationModel
类公开另一个属性。此属性负责将字符串
Id
列从
IdentityUser
转换为
Guid
。除此之外,我将覆盖
Id
属性(尽管保持逻辑相同),以添加一个漂亮的intelissense提示,即应该使用
Id
属性

public class ApplicationUser : IdentityUser
{
    /// <summary>
    /// The unique User GUID
    /// </summary>
    [NotMapped]
    public Guid ID
    {
        get { return Guid.Parse(this.Id); }
        set { this.Id = value.ToString(); }
    }

    /// <summary>
    /// weak userid reference. Use the property <seealso cref="WebApplication6.Models.ID"/> instead
    /// </summary>
    public override string Id { get { return base.Id; } set { base.Id = value; } }
}

非常感谢,该死的微软为什么不解决这个最简单的小问题呢@Rwing实际上是IUser实现设计的一部分。但我知道你的意思。希望这能有所帮助。有人能澄清一下这个答案是否只与Identity 1.0有关吗?Identity 2.0的发行版提到了指定TKey以允许您更改此数据类型的功能。(我只是想不出如何让它发挥作用,所以我不能肯定地说。)@Funka如果你还没有弄明白,那就简单地做2.0版中的IUser吧谢谢Casper,我忘了我留下了这条评论,但我确实弄明白了,并且可以证实这一点。对于子孙后代或任何遇到这种情况的人来说,是的,随着Identity 2.0.0的发布,现在更容易更改
IdentityUser
IdentityRole
上的主键类型。ASP.NET团队在他们的2.0.0发行说明中谈到了这一点,并提供了一个很好的示例应用程序,展示了如何在
public IdentityUser()
{
    this.Id = Guid.NewGuid().ToString();
    this.Claims = new List<IdentityUserClaim>();
    this.Roles = new List<IdentityUserRole>();
    this.Logins = new List<IdentityUserLogin>();
}