ASP.NET Core - 创建用户

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

  • Identity 框架有两个核心服务,一个是UserManager,另一个是SignInManager

  • 我们需要将这两个服务注入到我们的控制器中。 有了这个,我们可以在需要创建用户或登录用户时调用适当的 API。

  • 让我们为 SignInManager 和 UserManager 添加私有变量,然后在您的 AccountController 中添加一个构造函数,它将采用两个 User 类型的参数 UserManager 和一个 User 类型的 SignInManager。

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

public AccountController(UserManager<User> userManager, SignInManager<User> signManager){
   _userManager = userManager; 
   _signManager = signManager; 
}
  • 我们将继续使用 AccountController 的 POST 操作方法,我们应该始终在 post 操作中进行的首要检查之一是检查我们的 ModelState 是否有效。

  • 如果 ModelState 有效,则我们知道用户给了我们用户名和密码并确认了密码; 如果不是,我们需要要求他们提供正确的信息。

  • 这里是 Register 注册操作动作的实现。

[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 有效,我们需要与身份框架对话。 我们还需要创建 User 实体的新实例,并将我们的输入 model.Username 复制到 User 实体的 UserName 属性中。

  • 但是,我们不会复制密码,因为在 User 实体中没有地方可以存储明文密码。 相反,我们会将密码直接传递给身份框架,该框架将对密码进行哈希处理。

  • 所以我们有一个 userManager。 创建一个Async 异步方法,我们必须在其中传递用户名,以便我们可以保存该用户的密码。

  • 此 Async 异步方法返回一个结果,告诉我们实例是成功还是失败,如果失败,它会告诉我们失败的一些可能原因。

  • 如果结果成功,我们可以登录刚刚创建帐户的用户,然后请求 SignInManager 为该用户签名。 现在,将用户重定向回主页,您现在将通过身份验证。

  • 如果结果不成功,那么我们应该尝试告诉用户原因,从 UserManager 返回的结果有一个错误集合,我们可以迭代这些错误并将这些错误添加到 ModelState 中。 这些错误将在标签助手(如验证标签助手)的视图中可用,以在页面上显示信息。

  • 在 ModelState.AddModelError 中,我们可以提供一个键来将错误与特定字段相关联。 我们还将使用空白字符串并添加所提供错误的描述。

让我们保存所有文件并运行应用程序并转到/account/register

Register

让我们输入一个用户名和一个非常简单的 5 个字符的密码。

用户名和密码

现在,点击注册按钮。

Register Button

默认情况下,Identity 身份框架会尝试强制执行一些有关密码的规则。

密码必须至少有6个字符,一个字符必须是小写,一个必须是大写,并且必须有一个非数字字符。

这些错误出现在这里的原因是因为我们在页面上有一个验证摘要,它正在挑选从 userManager.CreateAsync 结果返回的错误。

现在我们对密码规则有了更多的了解,让我们尝试创建一个足够复杂的密码,然后单击注册。

User Management

您现在将看到主页。 这意味着该操作有效。 现在让我们转到 SQL Server 对象资源管理器。

Server Object Explorer

右键单击 dbo.AspNetUsers 表并选择View Data查看数据。

DBO AspNet Users

现在可以看到用户创建成功,并且在Users表中也可以看到一条新的记录。 您还可以看到哈希密码值和用户名,这是我们在 mark.upston 注册的用户名。