首页 文章

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

提问于
浏览
7

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

但是,ASPNet Identity v2.0将Email作为单独的列添加到Users表,并将相应的属性添加到IdentityUser类 .

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

请分享 .

Update

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

2 回答

  • 3

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

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

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

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

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

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

    • 尝试通过覆盖 User 类中的 Email 属性并取消映射或使用流畅的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);
    }
    
    • 当您注册用户时,请确保使用 UserName 填充 Email
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            // ...
        }
    }
    

    当然,你总是可以忽略 Email 列,如果你只是坐在你的 AspNetUsers 表中,并且是最好的方法,但请记住,忽略它你可能会失去ASP.NET身份2可能为你提供的新功能可能想用 .

    NOTE 但是我不确定选项号1是否适用于 Email 属性,因为如果你不需要它们,你可以如何摆脱其他列 . 我个人碰巧使用新的 Email 属性/列,所以我没有尝试过 .

    不确定它是否对你有帮助,但我想我会分享它以防万一 .

相关问题