ASP.NET Core - 创建用户

在本章中,我们将讨论如何创建用户.为了继续这一点,我们需要与Identity框架交互以确保用户有效,然后创建该用户,然后继续并将其登录.

  • 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 有效,我们需要与Identity框架进行交流.我们还需要创建User实体的新实例,并将输入 model.Username 复制到User实体的 UserName 属性中.

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

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

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

  • 如果结果成功,我们可以登录刚创建帐户的用户,然后让SignInManager签署此用户.现在,将用户重定向回主页,现在您将进行身份验证.

  • 如果结果不成功,那么我们应该尝试告诉用户为什么,从UserManager返回的结果有一组错误,我们可以迭代并将这些错误添加到ModelState中.这些错误将在标签帮助程序的视图中提供,例如验证标记帮助程序,以在页面上显示信息.

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

让我们保存所有文件并运行申请并转到/account/register .

Register

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

用户名和密码

现在,单击"注册"按钮.

注册按钮

默认情况下,Identity框架会尝试强制执行一些密码规则.

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

这些错误出现在这里的原因是因为我们有一个关于正在拾取错误的页面从 userManager.CreateAsync 结果返回.

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

用户管理

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

Server Object Explorer

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

DBO AspNet Users

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