原文: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. 缺少已登录用户跳回首页机制

ASP.NET Core 新增用户 - ASP.NET Core 基础教程 - 简单教程,简单编程的更多相关文章

  1. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

  2. asp.net core根据用户权限控制页面元素的显示

    asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelp ...

  3. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  4. ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 用户注册 上一章节我们终于迁移完了 Identity 的数据,也创建 ...

  5. ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 验证特性 上一章节我们简单介绍了 ...

  6. .NET Core+WebApi+EF访问数据新增用户数据

    新建一个.NET Core项目,我使用的IDE是VS2019 依次创建三个Core类库:第一个命名api.Model,第二个api.Common,第三个api.Bo 解释一下这个三类库的作用: 第一个 ...

  7. ASP.NET Core: 全新的ASP.NET !

    背景 最新版本的 ASP.NET 叫做 ASP.NET Core (也被称为 ASP.NET 5)   它颠覆了过去的 ASP.NET. 什么是 ASP.NET Core? ASP.NET Core ...

  8. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  9. ASP.NET Core 开发 - Entity Framework (EF) Core

    EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...

随机推荐

  1. [Javascript Natural] Break up language strings into parts using Natural

    A part of Natural Language Processing (NLP) is processing text by “tokenizing” language strings. Thi ...

  2. MySQL误删数据救命指南

    预防误操作导致文件/数据丢失的建议: 1.欲删除文件时,将rm命令改成mv,可在系统层面将rm命令做个alias(或参考Windows / Mac OSX做法,删除文件时先进回收站).2.删除数据库. ...

  3. 【u106】3D模型

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 一座城市建立在规则的n×m网格上,并且网格均由1×1正方形构成.在每个网格上都可以有一个建筑,建筑由若 ...

  4. [D3] Convert Dates to Numeric Values with Time Scales in D3 v4

    Mapping abstract values to visual representations is what data visualization is all about, and that’ ...

  5. js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素

    js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素 一.总结 一句话总结:closest()方法获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上.of ...

  6. VMware虚拟机12安装linux系统详细教程

    亲测有效,附图: 工具/原料 VM ware workstation12虚拟机(百度下载) 深度linux镜像ios系统文件 链接:https://pan.baidu.com/s/1RY1Plgru4 ...

  7. SNMP 配置

    http://blog.sina.com.cn/s/blog_593bf1da0100xsvu.html

  8. [Javascript] Case insensitive sorting for string arrays

    We look at the default Array.prototype.sort behavior and discuss how you can do case insensitive str ...

  9. [RxJS] Add debug method to Observable in TypeScript

    Observable.prototype.debug = function(message: any) { return this.do( (next) => { if(!environment ...

  10. [Vue] Import component into page

    Components are one of the most powerful features of Vue. Let's take a look at how to write our first ...