【问题标题】:Use Username instead of Email for identity in Asp.net mvc5在 Asp.net mvc5 中使用用户名而不是电子邮件作为身份
【发布时间】:2015-02-14 13:57:06
【问题描述】:

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

【问题讨论】:

  • Here 是一篇非常好的文章,你可以关注,你会得到答案。另请参阅此question您可以使用自己的用户管理器类并使用用户名而不是电子邮件。
  • 默认情况下,代码使用电子邮件作为用户名。 var user = new ApplicationUser { UserName = model.Email, Email = model.Email };。将 userName 属性添加到 RegisterViewModel 并改用它。

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


【解决方案1】:

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

如果其他人从谷歌搜索到这里,实际上很容易做到这一点。如果您查看注册发布操作,它只是将用户名设置为电子邮件地址。所以…………

将 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 操作中,将 UserName 设置为 ViewModel 的 UserName,将 Email 设置为 ViewModel 的 Email。

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

【讨论】:

  • 我不想以任何方式使用电子邮件。有没有什么方法不用提供邮箱就可以注册?
  • 我不知道电子邮件地址在模型中是否是强制性的,但如果不是,您可以删除注册视图中电子邮件地址的四行并用我列出的用户名代码替换它们更多。然后,您可以在 AccountController 的 post 操作中按如下方式设置新的 ApplicationUser。 var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };如果电子邮件地址是强制性的,只需将电子邮件设置为 string.empty
  • 对 string.Empty 的验证检查。 sasi kumar 的回答正确。
  • 做了同样的事情,但是注册不起作用,因为 RegisterViewModel 中的用户名仍然为空
【解决方案2】:

为了使电子邮件不唯一:

在 IdentityConfig 下面配置

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

【讨论】:

  • 这对我来说是最简单的解决方案,解决了我从 MVC 4 转换到 MVC 5 后遇到的一个问题。
  • 你是冠军!拯救了我的一天。这应该是公认的答案
【解决方案3】:

请查看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);
    

在视图中没有特殊需要更改。运行应用程序并使用电子邮件或用户名测试登录。

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

【讨论】:

    【解决方案4】:

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

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多