📅  最后修改于: 2020-11-21 05:06:08             🧑  作者: Mango
在本章中,我们将讨论如何创建用户。为此,我们需要与Identity框架进行交互,以确保用户有效,然后创建该用户,然后继续并登录。
Identity框架有两种核心服务,一种是UserManager ,另一种是SignInManager 。
我们需要将这两种服务都注入到我们的控制器中。这样,我们就可以在需要创建用户或登录用户时调用适当的API。
让我们为SignInManager和UserManager添加私有变量,然后在AccountController中添加一个构造函数,该构造函数将使用User类型的两个参数UserManager和User类型的SignInManager。
private SignInManager _signManager;
private UserManager _userManager;
public AccountController(UserManager userManager, SignInManager signManager){
_userManager = userManager;
_signManager = signManager;
}
我们将继续使用AccountController的POST操作方法,并且我们应始终在post操作内部进行的首批检查之一是检查我们的ModelState是否有效。
如果ModelState有效,则我们知道用户为我们提供了用户名和密码并确认了密码;如果没有,我们需要请他们提供正确的信息。
这是Register动作的实现。
[HttpPost]
public async Task 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实体的新实例,并将输入模型UserName复制到User实体的UserName属性中。
但是,我们不会复制密码,因为没有位置将纯文本密码存储在User实体中。相反,我们会将密码直接传递给Identity框架,该框架将对密码进行哈希处理。
因此,我们有一个userManager。创建一个异步方法,在该方法中我们必须传递用户名,以便我们可以保存该用户的密码。
这个异步方法返回一个结果,该结果告诉我们实例是成功还是失败,如果失败,它将为我们提供实例失败的一些可能原因。
如果结果成功,我们可以登录刚刚创建帐户的用户,然后要求SignInManager对该用户进行签名。现在,将用户重定向回主页,您将通过身份验证。
如果结果不成功,那么我们应该尝试告诉用户原因,并且从UserManager返回的结果包含一系列错误,我们可以迭代这些错误并将这些错误添加到ModelState中。这些错误将在标签帮助程序(如验证标签帮助程序)的视图中显示,以在页面上显示信息。
在ModelState.AddModelError中,我们可以提供一个将错误与特定字段关联的键。我们还将使用空字符串并添加所提供错误的描述。
让我们保存所有文件并运行应用程序,然后转到/ account / register 。
让我们输入一个用户名和一个非常简单的5字符密码。
现在,单击注册按钮。
默认情况下,身份框架尝试强制执行一些有关密码的规则。
密码必须至少包含6个字符,一个字符必须小写,一个字符必须大写,并且必须有一个非数字字符。
这些错误出现在这里的原因是因为我们在页面上有一个验证摘要,该摘要总结了从userManager.CreateAsync结果返回的错误。
现在,我们对密码规则有了更多的了解,让我们尝试创建一个足够复杂的密码,然后单击“注册”。
您现在将看到主页。这意味着该操作有效。现在让我们转到SQL Server对象资源管理器。
右键单击dbo.AspNetUsers表,然后选择“查看数据” 。
现在,您可以看到该用户已成功创建,并且还可以在Users表中看到一条新记录。您还可以看到哈希密码值以及用户名,这是我们在mark.upston中注册的用户名。