原文: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. 交换排序(java)

    package exchange_sort; import java.util.Random; /*各类交换排序  * ------数据存储范围1~s.length-1 ------  *主要包含   ...

  2. Giraph源代码分析(六)——Edge 分析

    HamaWhite 原创,转载请注明出处.欢迎大家增加Giraph 技术交流群: 228591158 欢迎訪问: 西北工业大学 - 大数据与知识管理研究室 (Northwestern Polytech ...

  3. link和@import引入外部样式的区别

    原文: 简书原文:https://www.jianshu.com/p/14f99062f29a 大纲 前言 1.隶属上的差别 2.加载顺序的不同 3.兼容性上的差别 4.使用DOM控制样式时的差别 5 ...

  4. blob-照片转换与展示

    File转java.sql.Blob(照片)Struts2 public Blob photos(File zp) { Blob photo=null; try { FileInputStream f ...

  5. ios开发网络学八:NSURLSession相关代理方法

    #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> /* ...

  6. 小梦词典WP8.1应用发布

    这几天一直在做这款应用,今天终于发布了! 小梦词典简介: 小梦词典是一款永久免费无广告的网络词典. 支持英汉单词查询: 支持中,英,法,韩,德,俄,日七国语言翻译,多语言极致体验: 支持生词本记忆,查 ...

  7. java判断字符串是否为数字

    我们在做安卓开发中,一定会遇到判断某字符串是否是数字的问题,本文使用正则表达式可以很方便的判断出来,希望本文对安卓开发者有所帮助.   1 public boolean isNumeric(Strin ...

  8. js进阶 11-9/10/11 jquery创建和插入节点

    js进阶 11-9/10/11 jquery创建和插入节点 一.总结 一句话总结: 1.jquery插入节点8个方法? 内部之前,内部之后,之前,之后:各两个 append()和appendTo() ...

  9. 修改VNC的分辨率

    http://blog.csdn.net/jlds123/article/details/9064437 有时候用VNC View打开远程linux桌面时,桌面显示不出来,只有一个灰色背景加上一个命令 ...

  10. Cocos2d-x3.0模版容器之中的一个:cocos2d::Vector&lt;T&gt;

    版本号:v3.0 beta以后 语言:C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCVector.h" 的头文件里. t ...