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 有效,那么我们知道用户给了我们一个用户名和密码并确认了密码;如果不是,我们需要让他们提供正确的信息。

  • 以下是 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属性中。

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

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

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

  • 如果结果成功,我们可以登录刚刚创建帐户的用户,然后要求 SignInManager 登录此用户。现在,将用户重定向回主页,您现在将被认证。

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

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

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

Register

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

Username and Password

现在,单击“注册”按钮。

Register Button

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

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

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

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

User Management

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

Server Object Explorer

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

DBO AspNet Users

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

广告