ASP.NET Core 创建用户

在本章中,我们将讨论如何创建用户。要继续进行此操作,我们需要与 Identity 框架交互以确保用户有效,然后创建该用户,然后继续并将其登录。

  • Identity 框架有两个核心服务,一个是 UserManager,另一个是 SignInManager
  • 我们需要将这两个服务注入控制器。这样,我们可以在需要创建用户或登录用户时调用适当的 API
  • 让我们为 SignInManagerUserManager 添加私有变量,然后在 AccountController 中添加构造函数,该构造函数将接受两个参数 UserManager 类型 UserSignInManager 类型 User
  1. private SignInManager<User> _signManager;
  2. private UserManager<User> _userManager;
  3. public AccountController(UserManager<User> userManager, SignInManager<User> signManager){
  4. _userManager = userManager;
  5. _signManager = signManager;
  6. }
  • 我们将继续使用 AccountControllerPOST 操作方法,我们应该始终在 POST 操作中进行的第一个检查是检查我们的 ModelState 是否有效。
  • 如果 ModelState 有效,那么我们知道用户给了我们一个用户名和密码,并确认了密码;如果没有,我们需要要求他们提供正确的信息。
  • 以下是注册操作的实现情况。
  1. [HttpPost]
  2. public async Task<IActionResult> Register(RegisterViewModel model)
  3. {
  4. if (ModelState.IsValid)
  5. {
  6. var user = new User { UserName = model.Username };
  7. var result = await _userManager.CreateAsync(user, model.Password);
  8. if (result.Succeeded)
  9. {
  10. await _signManager.SignInAsync(user, false);
  11. return RedirectToAction("Index", "Home");
  12. }
  13. else
  14. {
  15. foreach (var error in result.Errors)
  16. {
  17. ModelState.AddModelError("", error.Description);
  18. }
  19. }
  20. }
  21. return View();
  22. }
  • 如果我们的 ModelState 有效,我们需要与 Identity 框架对话。我们还需要创建 User 实体的新实例,并将 input model.Username 复制到 User 实体的 UserName 属性中。
  • 但是,我们不会复制密码,因为在 User 实体中没有位置存储纯文本密码。相反,我们将直接将密码传递给 Identity 框架,后者将对密码进行散列。
  • 所以我们有一个 userManager。创建一个 Async 方法,在该方法中我们必须传递用户名,以便保存该用户的密码。
  • Async 方法返回一个结果,该结果告诉我们实例是成功还是失败,如果失败,它将告诉我们它失败的一些可能原因。
  • 如果结果成功,我们可以登录刚刚创建帐户的用户,然后要求 SignInManager 为该用户签名。现在,将用户重定向回主页,您将获得身份验证。
  • 如果结果不成功,那么我们应该尝试告诉用户原因,并且 UserManager 返回的结果包含一组错误,我们可以迭代这些错误并将其添加到 ModelState 中。这些错误将出现在标记助手(如验证标记助手)的视图中,以在页面上显示信息。
  • ModelState.AddModelError 中,我们可以提供一个键来将错误与特定字段相关联。我们还将使用空白字符串并添加所提供错误的描述。

让我们保存代码并运行,然后跳转到到 /account/register

我们简单输入一下表单信息,密码只输入 5 位。

  • 默认情况下,Identity 框架尝试强制执行一些密码规则。
  • 密码必须至少有 6 个字符,一个字符必须小写,一个必须大写,并且必须有一个非数字字符。
  • 这些错误出现在这里的原因是,我们在页面上有一个验证摘要,该摘要收集了从 userManager.CreateAsync 结果返回的错误。
  • 现在我们对密码规则有了更多的了解,让我们尝试创建一个足够复杂的密码,然后单击注册。

注册成功,然后跳转到首页。这时可以查看数据库的用户表 AspNetUsers

现在您可以看到用户已成功创建,也可以在 Users 表中看到一条新记录。您还可以看到一个散列密码值以及一个用户名,这是我们新用户 Mask。