AspNet Identity 2.0电子邮件和用户名重复

时间:2014-04-14 08:30:41

标签: asp.net-mvc entity-framework asp.net-identity

我当前的Asp.Net MVC 5项目要求 UserName 电子邮件地址。现在我想升级 ASPNet Identity v1.0到 v2.0 以利用其所有新功能(see here)。

但是,ASPNet Identity v2.0将电子邮件添加为 Users 表的单独列,并将相应的属性添加到 IdentityUser

我不想将 UserName 复制到这个新的电子邮件列中。如何映射 IdentityUser的此电子邮件属性以使用现有的UserName列&属性?是否可以忽略此Email属性并跳过在Users表中添加列?有没有人试过这个?

请分享。

更新

这是身份2.0的限制。我们不能忽略电子邮件属性或将其保留为空。某些身份功能无效。 :(

2 个答案:

答案 0 :(得分:3)

您可以尝试以下方法之一:

  1. 尝试通过覆盖Email类中的User属性并取消映射或使用流畅的API来忽略它。

    public class ApplicationUser : IdentityUser
    {
      // ....
    
      [NotMapped]
      public override string Email { get; set; }
    }
    

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ApplicationUser>().Ignore(u => u.Email);
    }
    
  2. 当您注册用户时,请确保使用Email

    填充UserName
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            // ...
        }
    }
    
  3. 当然,如果您不打算使用它,您可以随时忽略Email列,因为它允许使用NULL,它只会位于带有大量NULL的AspNetUsers表中,不是最好的方法,但要记住,忽略它可能会丢失ASP.NET Identity 2可能提供的新功能。

    注意但是我不确定选项号1是否适用于Email属性,因为它可能在新身份代码中的所有位置使用。值得一试。我知道如果你不需要它们就可以摆脱其他列。我个人碰巧使用新的Email属性/列,所以我没有尝试过。

    不确定它是否对您有所帮助,但我认为我会分享它以防万一。

答案 1 :(得分:1)

我遇到同样的问题,我解决的方法是在创建用户时电子邮件地址与用户名相同:

var newUser = new ApplicationUser()
{
    UserName = email,
    Email = email,
};

但是,如果您尝试使用重复的用户名创建帐户,则会收到2个验证错误,一个用于用户名字段,另一个用于电子邮件地址。

要解决这个问题,请通过编辑identityconfig.cs文件来允许电子邮件地址不唯一(虽然它们的用户名是唯一的,但它们仍然是唯一的):

manager.UserValidator = new UserValidator<ApplicationUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = false
            };