在Asp.net mvc5中使用用户名而不是电子邮件来识别身份

时间:2014-12-16 09:39:26

标签: asp.net asp.net-mvc visual-studio

每当我使用visual studio 2013 express为web创建一个新应用程序并使用个人帐户身份验证并点击注册按钮时,我注意到它实现了“电子邮件”而不是“用户名”,同样在LoginViewModel中也是如此使用电子邮件登录而不是用户名。如何将此更改为使用用户名而不是默认电子邮件?另外我想知道如何将字符串类型的默认'guid'转换为'id'(整数类型)。

4 个答案:

答案 0 :(得分:42)

接受的答案中的链接问题描述了如何使用Email而不是UserName,OP想要UserName而不是电子邮件,这是我在MVC项目中的Identity 2.0中寻找的。

如果其他人从谷歌搜索到达这里,实际上很容易做到这一点。如果您查看注册后发布操作,只需将UserName设置为电子邮件地址即可。所以.........

将UserName添加到RegisterViewModel并将其添加到寄存器视图。

<div class="form-group">
        @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.UserName, new { @class = "form-control", @placeholder = "Username or email" })
        </div>
</div>

在AccountController上的Register Post Action中,将UserName设置为ViewModel的UserName,将Email设置为ViewModel的电子邮件。

var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };

答案 1 :(得分:21)

为了使电子邮件成为非唯一的:

在IdentityConfig中配置以下

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

答案 2 :(得分:0)

请查看此thread

线程详细信息:

假设:

  1. 用户名对于每个用户都是唯一的。它可以由用户输入,也可以由应用程序在注册时生成。
  2. 用户名中不允许使用@符号。

删除EmailAddress批注并在默认的LoginViewModel中定义显示文本:

public class LoginViewModel
{
    [Required]
    [Display(Name = "Username/Email")]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

由于用户可以输入UsernameEmail,因此我们将使用@字符作为验证标准。这是要实现的流程:

  1. 如果字符串@中存在,则应用Email验证,否则应用Username格式验证。
  2. 如果有效的Email,首先我们需要获取Username。由于Username是唯一的,因此我们可以使用userManager.FindByEmailAsync方法来获取它。
  3. 使用Username进行SignIn验证。

    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
       ViewData["ReturnUrl"] = returnUrl;
       if (model.Email.IndexOf('@') > -1)
       {
           //Validate email format
           string emailRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                            @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                              @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
           Regex re = new Regex(emailRegex);
           if (!re.IsMatch(model.Email))
           {
               ModelState.AddModelError("Email", "Email is not valid");
           }
       }
       else
       {
           //validate Username format
           string emailRegex = @"^[a-zA-Z0-9]*$";
           Regex re = new Regex(emailRegex);
           if (!re.IsMatch(model.Email))
           {
               ModelState.AddModelError("Email", "Username is not valid");
           }
       }
    
       if (ModelState.IsValid)
       {
           var userName = model.Email;
           if (userName.IndexOf('@') > -1)
           {
               var user =  await _userManager.FindByEmailAsync(model.Email);
               if (user == null)
               {
                   ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                   return View(model);
               }
               else
               {
                    userName = user.UserName;
               }
            }
            var result = await _signInManager.PasswordSignInAsync(userName, model.Password, model.RememberMe, lockoutOnFailure: false);
    

无需特别更改View。运行该应用程序并使用电子邮件或用户名测试登录。

注意 :请记住,本教程遵循MVC .Net Identity默认结构。

答案 3 :(得分:0)

您还可以像这样使用用户名和/或密码

var user = await _userManager.Users
       .FirstOrDefaultAsync(u => u.UserName == username || u.Email == username);

if (user != null){
var result = await _signInManager
            .PasswordSignInAsync(user.Email, password, false, false);
}