Использовать имя пользователя вместо электронной почты для идентификации в Asp.net mvc5

Всякий раз, когда я создаю новое приложение с визуальной студией 2013 Express для веб-сайта и использую аутентификацию отдельных учетных записей, и я нажимаю кнопку регистрации, я замечаю, что он реализует "Email" вместо "Username", и то же самое в LoginViewModel, поскольку он использует Email для входа вместо имени пользователя. Как я могу изменить это, чтобы использовать Имя пользователя вместо электронной почты по умолчанию без проблем? Также я хотел бы знать, как преобразовать по умолчанию "guid", который является строковым типом, в "id" (целочисленный тип).

Ответ 1

Связанный вопрос в принятом ответе описывает, как использовать Email вместо UserName, OP хотел, чтобы UserName вместо электронной почты это то, что я искал в Identity 2.0 в проекте MVC.

В случае, если кто-то еще попадет сюда из поиска Google, на самом деле это очень легко сделать. Если вы посмотрите на действие регистрации, это просто указывает 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>

В действии Register Post на AccountController установите UserName в UserMode ViewModel и электронную почту на электронную почту ViewModel.

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

Ответ 2

Чтобы сделать электронную почту не уникальной:

Настройте ниже в IdentityConfig

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

Ответ 3

Прежде всего, я прошу прощения за мой английский. Я итальянец На самом деле я хочу знать, если возможно использовать другое поле таблицы, помимо электронной почты и пароля? Я только что добавил новое поле в таблицу "Пользователь", как Имя и Фамилия. Другими словами, я хотел бы иметь register.aspx, например:

Электронная почта: Пароль: Имя: Фамилия: Имя пользователя

Заранее спасибо за ваши ответы

Ответ 4

Пожалуйста, посмотрите в эту тему

Детали нити:

Предположения:

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

Пользователь может ввести Username или Email, поэтому мы будем использовать символ @для критериев проверки. Вот поток, который будет реализован:

  1. Если в строке присутствует @, примените проверку Email иначе примените проверку формата имени Username.
  2. В случае действительного адреса Email, сначала нам нужно получить Username. Поскольку считается, что Username уникально, мы можем получить его с userManager.FindByEmailAsync метода 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);
    

Нет особой необходимости менять в представлении. Запустите приложение и проверьте логин с помощью Email или логина.

Примечание: имейте в виду, что это руководство следует структуре по умолчанию MVC.Net Identity.

Ответ 5

Вы также можете использовать имя пользователя и/или пароль, как это

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