Учебники

ASP.NET Core — создание пользователя

В этой главе мы обсудим, как создать пользователя. Чтобы продолжить, нам нужно взаимодействовать с платформой Identity, чтобы убедиться, что пользователь действителен, затем создать этого пользователя, а затем продолжить и войти в систему.

  • Существует две основные службы платформы Identity: одна — UserManager , а другая — SignInManager .

  • Нам нужно внедрить обе эти службы в наш контроллер. При этом мы можем вызывать соответствующие API, когда нам нужно создать пользователя или войти в систему.

  • Давайте добавим приватные переменные для SignInManager и UserManager, а затем добавим конструктор в ваш AccountController, который будет принимать два параметра UserManager типа User и SignInManager типа User.

Существует две основные службы платформы Identity: одна — UserManager , а другая — SignInManager .

Нам нужно внедрить обе эти службы в наш контроллер. При этом мы можем вызывать соответствующие API, когда нам нужно создать пользователя или войти в систему.

Давайте добавим приватные переменные для SignInManager и UserManager, а затем добавим конструктор в ваш AccountController, который будет принимать два параметра UserManager типа User и SignInManager типа User.

private SignInManager<User> _signManager; 
private UserManager<User> _userManager;  

public AccountController(UserManager<User> userManager, SignInManager<User> signManager){
   _userManager = userManager; 
   _signManager = signManager; 
}
  • Мы продолжим с методом действия POST AccountController, и одна из первых проверок, которую мы всегда должны делать внутри действия post, — это проверка, является ли наш ModelState действительным.

  • Если ModelState действителен, то мы знаем, что пользователь дал нам имя пользователя и пароль и подтвердил пароль; если нет, мы должны попросить их предоставить правильную информацию.

  • Вот реализация действия Регистра.

Мы продолжим с методом действия POST AccountController, и одна из первых проверок, которую мы всегда должны делать внутри действия post, — это проверка, является ли наш ModelState действительным.

Если ModelState действителен, то мы знаем, что пользователь дал нам имя пользователя и пароль и подтвердил пароль; если нет, мы должны попросить их предоставить правильную информацию.

Вот реализация действия Регистра.

[HttpPost] 
public async Task<IActionResult> Register(RegisterViewModel model) { 
   if (ModelState.IsValid) { 
      var user = new User { UserName = model.Username }; 
      var result = await _userManager.CreateAsync(user, model.Password);
     
      if (result.Succeeded) { 
         await _signManager.SignInAsync(user, false); 
         return RedirectToAction("Index", "Home"); 
      } else { 
         foreach (var error in result.Errors) { 
            ModelState.AddModelError("", error.Description); 
         } 
      }  
   } 
   return View(); 
}        
  • Если наш ModelState действителен, нам нужно поговорить с платформой Identity. Нам также необходимо создать новый экземпляр нашей сущности User и скопировать наш входной файл model.Username в свойство UserName сущности User.

  • Но мы не собираемся копировать пароль, потому что нет места для хранения обычного текстового пароля в объекте User. Вместо этого мы передадим пароль непосредственно в инфраструктуру Identity, которая будет хэшировать пароль.

  • Итак, у нас есть userManager. Создайте метод Async, в котором мы должны передать имя пользователя, чтобы мы могли сохранить пароль для этого пользователя.

  • Этот метод Async возвращает результат, который сообщает нам, был ли экземпляр успешным или неудачным, и если он потерпел неудачу, он даст нам несколько возможных причин, по которым произошел сбой.

  • Если результат успешен, мы можем войти в систему пользователя, который только что создал учетную запись, а затем попросить SignInManager подписать этого пользователя. Теперь перенаправьте пользователя обратно на домашнюю страницу, и вы будете аутентифицированы.

  • Если результат не был успешным, то мы должны попытаться сообщить пользователю, почему, и результат, возвращаемый из UserManager, содержит набор ошибок, которые мы можем повторить и добавить эти ошибки в ModelState. Эти ошибки будут доступны в представлении для помощников тегов, таких как помощники тегов проверки, для отображения информации на странице.

  • В ModelState.AddModelError мы можем предоставить ключ, чтобы связать ошибку с конкретным полем. Мы также будем использовать пустую строку и добавим описание предоставленной ошибки.

Если наш ModelState действителен, нам нужно поговорить с платформой Identity. Нам также необходимо создать новый экземпляр нашей сущности User и скопировать наш входной файл model.Username в свойство UserName сущности User.

Но мы не собираемся копировать пароль, потому что нет места для хранения обычного текстового пароля в объекте User. Вместо этого мы передадим пароль непосредственно в инфраструктуру Identity, которая будет хэшировать пароль.

Итак, у нас есть userManager. Создайте метод Async, в котором мы должны передать имя пользователя, чтобы мы могли сохранить пароль для этого пользователя.

Этот метод Async возвращает результат, который сообщает нам, был ли экземпляр успешным или неудачным, и если он потерпел неудачу, он даст нам несколько возможных причин, по которым произошел сбой.

Если результат успешен, мы можем войти в систему пользователя, который только что создал учетную запись, а затем попросить SignInManager подписать этого пользователя. Теперь перенаправьте пользователя обратно на домашнюю страницу, и вы будете аутентифицированы.

Если результат не был успешным, то мы должны попытаться сообщить пользователю, почему, и результат, возвращаемый из UserManager, содержит набор ошибок, которые мы можем повторить и добавить эти ошибки в ModelState. Эти ошибки будут доступны в представлении для помощников тегов, таких как помощники тегов проверки, для отображения информации на странице.

В ModelState.AddModelError мы можем предоставить ключ, чтобы связать ошибку с конкретным полем. Мы также будем использовать пустую строку и добавим описание предоставленной ошибки.

Давайте сохраним все файлы и запустим приложение и перейдем в / account / register .

регистр

Давайте введем имя пользователя и очень простой 5-значный пароль.

Имя пользователя и пароль

Теперь нажмите кнопку Зарегистрироваться.

Кнопка регистрации

По умолчанию платформа Identity пытается применить некоторые правила к паролям.

Пароли должны содержать не менее 6 символов, один символ должен быть в нижнем регистре, один должен быть в верхнем регистре, и должен быть один нецифровый символ.

Причина, по которой эти ошибки появляются здесь, заключается в том, что у нас есть сводка проверки на странице, которая собирает ошибки, возвращаемые из результата userManager.CreateAsync .

Теперь, когда мы немного больше узнали о правилах паролей, давайте попробуем создать достаточно сложный пароль и нажать Зарегистрировать.

Управление пользователями

Теперь вы увидите домашнюю страницу. Это значит, что операция сработала. Теперь перейдем к обозревателю объектов SQL Server.

Обозреватель объектов сервера

Щелкните правой кнопкой мыши таблицу dbo.AspNetUsers и выберите « Просмотр данных» .

DBO AspNet Users

Теперь вы можете видеть, что пользователь был успешно создан, а также вы можете увидеть новую запись в таблице Users. Вы также можете увидеть хешированное значение пароля, а также имя пользователя, и это имя пользователя, которое мы зарегистрировали в mark.upston .