从零开始学ASP.NET Core Identity框架( 三 )

运行项目后,单击注册按钮即可看到图21.2所示的效果图,接下来我们实现处理HttpPOST请求到/account/register的Register()操作方法 。然后通过表单Taghelpers将数据发布到ASP.NET Core Identity中创建账户 。
21.3 UserManager和SignInManager服务在本节我们学习使用ASP.NET Core Identity提供的UserManager服务创建新用户,然后使用其提供的SignInManager服务来登录用户 。
UserManager <IdentityUser>类包含管理基础数据存储中的用户所需的方法 。比如,此类具有CreateAsync()、DeleteAsync()和UpdateAsync()等方法来创建、删除和更新用户,如图21.3所示 。

从零开始学ASP.NET Core Identity框架

文章插图
 
图21.3
SignInManager <IdentityUser>类包含用户登录所需的方法 。比如,SignInManager类具有SignInAsync()、SignOutAsync()等方法来登录和注销用户,如图21.4所示 。
  • UserManager和SignInManager服务都需要使用构造函数注入AccountController,并且这两个服务都接收泛型参数 。
  • 这些服务接收泛型参数的User类 。目前,我们使用内置的IdentityUser类作为泛型参数的参数 。
  • 这两个服务的通用参数User是一个扩展类 。这意味着,我们可以自定义与用户有关的信息和其他数据,来创建我们的自定义用户 。

从零开始学ASP.NET Core Identity框架

文章插图
 
图21.4
  • 我们可以声明自己的自定义类作为泛型参数,而不是内置的IdentityUser类 。
以下是AccountController的完整代码 。
using Microsoft.AspNetCore.Identity;using Microsoft.AspNetCore.Mvc;using MockSchoolManagement.ViewModels;using System.Threading.Tasks;namespace MockSchoolManagement.Controllers{public class AccountController:Controller{private UserManager<IdentityUser> _userManager;private SignInManager<IdentityUser> _signInManager;public AccountController(UserManager<IdentityUser> userManager,SignInManager<IdentityUser> signInManager){this._userManager = userManager;this._signInManager = signInManager;}[HttpGet]public IActionResult Register(){return View();}[HttpPost]public async Task<IActionResult> Register(RegisterViewModel model){if(ModelState.IsValid){//将数据从RegisterViewModel复制到IdentityUservar user = new IdentityUser{UserName = model.Email,Email = model.Email};//将用户数据存储在AspNetUsers数据库表中var result = await _userManager.CreateAsync(user,model.Password);//如果成功创建用户,则使用登录服务登录用户信息//并重定向到HomeController的索引操作if(result.Succeeded){await _signInManager.SignInAsync(user,isPersistent:false);return RedirectToAction("index","home");}//如果有任何错误,则将它们添加到ModelState对象中//将由验证摘要标记助手显示到视图中foreach(var error in result.Errors){ModelState.AddModelError(string.Empty,error.Description);}}return View(model);}}}此时,如果读者运行项目并提供有效的邮箱地址和密码,则它会在SQL Server数据库的AspNetUsers表中创建账户 。读者可以从Visual Studio的SQL Server对象资源管理器中查看此数据,如图21.5所示 。
从零开始学ASP.NET Core Identity框架

文章插图
 
图21.5
21.3.1 ASP.NET Core Identity中对密码复杂度的处理在刚刚注册的时候,我们发现有两个问题 。
  • 密码验证机制太复杂了 。
  • 它是英文的,对于我们来说支持不是很友好 。
这是因为ASP.NET Core IdentityOptions类在ASP.NET Core中用于配置密码复杂性规则 。默认情况下,ASP.NET Core身份不允许创建简单的密码来保护我们的应用程序免受自动暴力攻击 。
当我们尝试使用像abc这样的简单密码注册新账户时,会显示创建失败,读者将看到如图21.6所示的验证错误 。
从零开始学ASP.NET Core Identity框架

文章插图
 
图21.6
我们在图21.6中看到中文提示,后面的章节会告诉读者如何配置 。
21.3.2 ASP.NET Core Identity密码默认设置在ASP.NET Core Identity中,密码默认设置在PasswordOptions类中 。读者可以在ASP.NET Core GitHub仓库中找到此类的源代码 。只需在仓库中搜索PasswordOptions类 。
代码如下 。
public class PasswordOptions{public int RequiredLength{get;set;} = 6;public int RequiredUniqueChars{get;set;} = 1;public bool RequireNonAlphanumeric{get;set;} = true;public bool RequireLowercase{get;set;} = true;public bool RequireUppercase{get;set;} = true;public bool RequireDigit{get;set;} = true;}相关参数的说明如表21.1(略)所示 。
21.3.3 覆盖ASP.NET Core身份中的密码默认设置我们可以通过在Startup类的ConfigureServices()方法中使用IServiceCollection接口的Configure()方法来实现这一点 。


推荐阅读