ASP.NET Core 创建用户
在本章中,我们将讨论如何创建用户。要继续进行此操作,我们需要与 Identity 框架交互以确保用户有效,然后创建该用户,然后继续并将其登录。
- 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;
}
- 我们将继续使用 AccountController 的 POST 操作方法,我们应该始终在 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
实体的新实例,并将 inputmodel.Username
复制到User
实体的UserName
属性中。 - 但是,我们不会复制密码,因为在
User
实体中没有位置存储纯文本密码。相反,我们将直接将密码传递给 Identity 框架,后者将对密码进行散列。 - 所以我们有一个 userManager。创建一个
Async
方法,在该方法中我们必须传递用户名,以便保存该用户的密码。 - 此
Async
方法返回一个结果,该结果告诉我们实例是成功还是失败,如果失败,它将告诉我们它失败的一些可能原因。 - 如果结果成功,我们可以登录刚刚创建帐户的用户,然后要求 SignInManager 为该用户签名。现在,将用户重定向回主页,您将获得身份验证。
- 如果结果不成功,那么我们应该尝试告诉用户原因,并且 UserManager 返回的结果包含一组错误,我们可以迭代这些错误并将其添加到
ModelState
中。这些错误将出现在标记助手(如验证标记助手)的视图中,以在页面上显示信息。 - 在
ModelState.AddModelError
中,我们可以提供一个键来将错误与特定字段相关联。我们还将使用空白字符串并添加所提供错误的描述。
让我们保存代码并运行,然后跳转到到 /account/register
我们简单输入一下表单信息,密码只输入 5 位。
- 默认情况下,Identity 框架尝试强制执行一些密码规则。
- 密码必须至少有 6 个字符,一个字符必须小写,一个必须大写,并且必须有一个非数字字符。
- 这些错误出现在这里的原因是,我们在页面上有一个验证摘要,该摘要收集了从
userManager.CreateAsync
结果返回的错误。 - 现在我们对密码规则有了更多的了解,让我们尝试创建一个足够复杂的密码,然后单击注册。
注册成功,然后跳转到首页。这时可以查看数据库的用户表 AspNetUsers。
现在您可以看到用户已成功创建,也可以在 Users 表中看到一条新记录。您还可以看到一个散列密码值以及一个用户名,这是我们新用户 Mask。