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](https://www.w3ccoo.com/asp.net_core/images/register.jpg)
让我们输入一个用户名和一个非常简单的 5 个字符的密码。
![用户名和密码](https://www.w3ccoo.com/asp.net_core/images/username_password.jpg)
现在,点击注册按钮。
![Register Button](https://www.w3ccoo.com/asp.net_core/images/register_button.jpg)
默认情况下,Identity 身份框架会尝试强制执行一些有关密码的规则。
密码必须至少有6个字符,一个字符必须是小写,一个必须是大写,并且必须有一个非数字字符。
这些错误出现在这里的原因是因为我们在页面上有一个验证摘要,它正在挑选从 userManager.CreateAsync 结果返回的错误。
现在我们对密码规则有了更多的了解,让我们尝试创建一个足够复杂的密码,然后单击注册。
![User Management](https://www.w3ccoo.com/asp.net_core/images/user_management.jpg)
您现在将看到主页。 这意味着该操作有效。 现在让我们转到 SQL Server 对象资源管理器。
![Server Object Explorer](https://www.w3ccoo.com/asp.net_core/images/server_object_explorer.jpg)
右键单击 dbo.AspNetUsers 表并选择View Data查看数据。
![DBO AspNet Users](https://www.w3ccoo.com/asp.net_core/images/dbo_aspnet_users.jpg)
现在可以看到用户创建成功,并且在Users表中也可以看到一条新的记录。 您还可以看到哈希密码值和用户名,这是我们在 mark.upston 注册的用户名。