ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程

简介: 原文:ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新增用户 上一章节我们实现了一个注册表单,但也留了一些东西还没完成,就是提交注册表单后的动作。

原文:ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core 新增用户

上一章节我们实现了一个注册表单,但也留了一些东西还没完成,就是提交注册表单后的动作。使用 Identity 实现注册功能,但提交注册表单后,需要做的事情很多,比如与 Identity 框架进行交互,以确保用户有效,告诉 Identity 框架创建该用户

在本章节,我们将学习如何创建用户,如何与 Identity 框架进行交互,以确保用户有效,然后创建该用户,最后使用注册的进行登录操作

所有的这些事情,都与 Identity 框架的两个核心服务: UserManager 和 SignInManager 有关

我们需要将这两项服务注入我们的控制器 AccountController ,然后才能在创建用户或登录用户时调用相应的 API

首先在 AccountController 控制器中添加两个使用 User 范型的 SignInManagerUserManager 类型的私有变量,然后再创建一个构造函数,用于接收这两个类型的参数

private SignInManager<User> _signManager; private UserManager<User> _userManager; public AccountController(UserManager<User> userManager, SignInManager<User> signManager) { _userManager = userManager; _signManager = signManager; } 

接下来在使用了 [HttpPost] 特性的 Signup 方法中检查和验证提交的数据是否有效,主要是通过检查 ModelState 是否有效

[HttpPost] 
public async Task<IActionResult> Signup(RegisterViewModel model) { if (ModelState.IsValid) { } return View(); } 

如果 ModelState 有效,则使用 UserName 来创建一个 User 的实例,并使用 _userManager 异步保存用户名和密码。

  1. 如果保存成功,则使用 _signManager 直接登录然后跳回首页
  2. 如果保存失败,则告知用户,并让用户输入正确的数据

内容是不是很多,不过反应到代码上,就寥寥几行

[HttpPost] 
public async Task<IActionResult> Signup(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(); } 

我们来详细看看这段代码

  1. 如果 ModelState 有效,则使用 UserName 来创建一个 User 的实例

  2. 但是我们并没有把密码和传递给 User ,因为 User 并没有属性来保存明文密码,所以我们只能直接将密码传递给 Identity 框架,框架会自动哈希密码

  3. 为了使用 Identity 框架保存用户数据,我们使用 UserManager 的异步方法 CreateAsync,该方法接收用户名和明文密码,然后使用这些数据创建一个新的用户

  4. 异步方法 CreateAsync 会返回一个结构,告诉我们是成功创建了用户还是失败了,如果失败了,会返回一些失败的原因

  5. 如果结果是成功的,就登录刚刚创建帐户的用户,且使用 SignInManager 为该用户签名,最后将用户重定向回主页

  6. 如果结果不成功,则告诉用户为什么,将 UserManager 返回的错误结果迭代添加到 ModelState 中。然后视图中就可以使用标签助手 ( 如验证标签助手 ) 显示这些错误信息

  7. ModelState.AddModelError 方法接收一个键值对参数,第一个参数为键,第二个参数为值,如果键是空的,那么就会把所有错误都放在一起

  8. 最后,因为我们使用了异步方法,所以返回结果必须也是异步的,需要使用 async Task<IActionResult>

最后,当然了,为了让程序能正常运行,我们还需要引入三个命名空间 System.ComponentModel.DataAnnotationsSystem.Threading.TasksHelloWorld.Models ,然后删除 AccountController() 空的构造函数

所有这些修改完成后,AccountController.cs 的代码如下

using System;
using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using System.ComponentModel.DataAnnotations; using HelloWorld.Models; namespace HelloWorld.Controllers { public class AccountController : Controller { private SignInManager<User> _signManager; private UserManager<User> _userManager; public AccountController(UserManager<User> userManager, SignInManager<User> signManager) { _userManager = userManager; _signManager = signManager; }  [HttpGet] public ViewResult Signup() { return View(); }  [HttpPost] public async Task<IActionResult> Signup(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(); } } public class RegisterViewModel {  [Required, MaxLength(64)] public string Username { get; set; }  [Required, DataType(DataType.Password)] public string Password { get; set; }  [DataType(DataType.Password), Compare(nameof(Password))] public string ConfirmPassword { get; set; } } } 

注册演示

现在,我们重启应用程序,刷新浏览器,来到注册界面,输入 yufeiaBc123@456

因为密码规则必须是 6 个字符以上且包含一个大写字母和小写字母,且必须包含一个非数组字母字符,所以如果不是这种格式则会报错,比如 123 则输出错误如下

注册成功后就会跳转到首页

如果使用 SQLite Studio 打开我们的 blogging.db 数据库,就可以看到我们刚刚创建的用户

本章到这里就已经结束了,我们已经实现了一个相对完整的注册功能,为啥说是相对完整呢?

  1. 缺少防恶意和机器注册机制,也就是应该让输入手机号和邮箱然后发送验证码
  2. 缺少验证码,这样可能导致频繁的刷接口注册
  3. 缺少已登录用户跳回首页机制
目录
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
30 1
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
Oracle 关系型数据库 .NET
在 Linux 操作系统中运行 ASP.NET 4(上“.NET研究”)
  目前最流行的 Linux 操作系统发行版是 Ubuntu。但是我们这次是要在 Linux 操作系统中运行 ASP.NET 的,所以选择了 openSUSE。我准备在 Oracle VM VirtualBox 中安装 openSUSE 11.3 操作系统。
1534 0
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
43 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
63 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
49 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
129 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
195 0
下一篇
无影云桌面