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

回到Startup类的ConfigureServices()方法中,在AddIdentity()服务中使用AddErrorDescriber()方法覆盖默认的错误提示内容,代码如下 。
services.AddIdentity<IdentityUser,IdentityRole>().AddErrorDescriber<CustomIdentityErrorDescriber>().AddEntityFrameworkStores<AppDbContext>();配置完成之后,提示变为中文,注册时密码长度达到6位即可 。
21.4 登录状态及注销功能的实现在本节中我们学习如何判断用户是否登录,以及注册、登录和注销等功能是否可实现 。
首先来看一看如何在ASP.NET Core中实现注销功能 。如果用户未登录,则显示登录和注册按钮,如图21.7所示 。

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

文章插图
 
图21.7
如果用户已登录,请隐藏登录和注册按钮并显示注销按钮,如图21.8所示 。
从零开始学ASP.NET Core Identity框架

文章插图
 
图21.8
我们需要在_Layout.cshtml文件中找到ID为collapsibleNavbar的导航菜单栏,修改代码如下 。
在下方代码中注入了SignInManager,以便我们检查用户是否已登录,来决定显示和隐藏的内容 。
@using Microsoft.AspNetCore.Identity @inject SignInManager<IdentityUser>_signInManager<div class="collapse navbar-collapse" id="collapsibleNavbar"><ul class="navbar-nav"><li class="nav-item"><a class="nav-link" asp-controller="home" asp-action="index">学生列表</a></li><li class="nav-item"><a class="nav-link" asp-controller="home" asp-action="create">添加学生</a></li></ul><ul class="navbar-nav ml-auto">@*如果用户已登录,则显示注销链接*@ @if(_signInManager.IsSignedIn(User)) {<li class="nav-item"><form method="post" asp-controller="account" asp-action="logout"><button type="submit" style="width:auto"class="nav-link btn btn-link py-0">注销 @User.Identity.Name</button></form></li>}else{<li class="nav-item"><a class="nav-link" asp-controller="account" asp-action="register">注册</a></li><li class="nav-item"><a class="nav-link" asp-controller="account" asp-action="login">登录</a></li>}</ul></div></IdentityUser>然后在AccountController中添加以下Logout()方法 。
[HttpPost]public async Task<IActionResult> Logout(){await _signInManager.SignOutAsync();return RedirectToAction("index","home");}请注意,我们使用POST请求将用户注销,而不使用GET请求,因为该方法可能会被滥用 。恶意者可能会诱骗用户单击某张图片,将图片的src属性设置为应用程序注销URL,这样会造成用户在不知不觉中退出了账户 。
21.5 ASP.NET Core Identity中的登录功能实现在本节中,我们将讨论使用ASP.NET Core Identity的API在ASP.NET Core应用程序中实现登录功能 。要在ASP.NET Core应用程序中实现登录功能,我们需要实现以下功能 。
  • 登录视图模型 。
  • 登录视图 。
  • AccountController中的两个Login()操作方法 。
21.5.1 LoginViewModel登录视图模型要在系统中登录用户,则需要其邮箱、用户名、密码以及使其选择是否需要持久性Cookie或会话Cookie 。
public class LoginViewModel{[Required][EmailAddress]public string Email{get;set;}[Required][DataType(DataType.Password)]public string Password{get;set;}[Display(Name = "记住我")]public bool RememberMe{get;set;}}21.5.2 登录视图的代码登录视图的代码如下 。
@model LoginViewModel@{ViewBag.Title = "用户登录";}<h1>用户登录</h1><div class="row"><div class="col-md-12"><form method="post"><div asp-validation-summary="All" class="text-danger"> </div><div class="form-group"><label asp-for="Email"> </label><input asp-for="Email" class="form-control" /><span asp-validation-for="Email" class="text-danger"> </span></div><div class="form-group"><label asp-for="Password"> </label><input asp-for="Password" class="form-control" /><span asp-validation-for="Password" class="text-danger"> </span></div><div class="form-group"><div class="checkbox"><label asp-for="RememberMe"><input asp-for="RememberMe" />@Html.DisplayNameFor(m => m.RememberMe)</label></div></div><button type="submit" class="btn btn-primary">登录</button></form></div></div>


推荐阅读