ASP.NET Core Identity框架介绍与使用

1 ASP.NET Core Identity框架

Identity (标识)框架:采用的是基于角色的访问控制策略(Role-Based-Controll-Access),内置了对用户、角色等表的管理以及相关的接口,支持外部登录、2FA等。
Identity框架使用EFcore对数据库进行操作(默认使用的SqlServer的数据库),这也意味值标识框架几乎支持所有的数据库。
Identity 框架是AspNetCore中内置的一个帮开发人员简化用户角色等处理的一个框架。 这是因为框架底层已经根据权限设计设计了相应的表并提供了权限设计的相关接口,引入Identity框架后,调用框架提供的API就可以完成我们的业务逻辑。

2 AspNetCore中配置Identity

导入nuget包

    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.32" /><PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.17" /><PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.17"/>

前提使用的是AspNetCore3.1,依赖的nugetMicrosoft.AspNetCore.Identity.EntityFrameworkCore版本为3.1.32。值得注意的是Microsoft.AspNetCore.Identity.EntityFrameworkCore同时整合了EntityFramworkCore和Identity,默认使用的是 S q l S e r v e r \textcolor{red}{SqlServer} SqlServer的数据库。这里演示同样适用SQLServer的数据库作为演示

Microsoft.EntityFrameworkCore.SqlServer 5.0.17 sqlserver的数据库驱动

Microsoft.EntityFrameworkCore.Tools 5.0.17 数据库迁移命令工具包 (Add-Migration xxx Update-Database)

在Identity框架中有两个非常中的类 。其中 Tkey代表了主键的类型

  • 用户 I d e n t i t y U s e r < T k e y > \textcolor{red}{ IdentityUser<Tkey>} IdentityUser<Tkey> 定义了用户id,用户名,手机号,密码hash值等属性
    在这里插入图片描述

  • 角色 I d e n t i t y R o l e < T k e y > \textcolor{red}{ IdentityRole<Tkey>} IdentityRole<Tkey>
    在这里插入图片描述
    我们可以用上述类信息,但同时也可以在上述的基础上定义用户或者是角色的其他信息。只需要集成上述两个基类即可。

    public class MyUser:IdentityUser<long>{}public class MyRole:IdentityRole<long>{}

创建基础自IdentityDBContext的类,这是一个泛型类,有三个泛型参数,用户类型、角色类型、主键类型 。这三个泛型定义不可省略,可以通过这个DB上下文类来操作数据库。

public class IdentityDemoDBContext:IdentityDbContext<MyUser,MyRole,long>{public IdentityDemoDBContext(DbContextOptions<IdentityDemoDBContext> options) : base(options){}protected override void OnModelCreating(ModelBuilder builder){builder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);base.OnModelCreating(builder);}}

定义上述类后,需要在IOC容器中注入Identity的服务

 #region Identity框架配置//引入与Identity框架正式使用到的DBContextservices.AddDbContext<IdentityDemoDBContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("SqlServer"))) ;//Identity用户配置//注入的应该是AddIdentityCore,而不是AddIdentity,因为前者是使用前后端分离的项目,后者默认提供了权限操作的界面,更适用于MVC的项目services.AddIdentityCore<MyUser>(options=> {//密码规则options.Password.RequireDigit = false;//密码中不必含有数字options.Password.RequireLowercase = false;//密码中不必要小写字母options.Password.RequireNonAlphanumeric = false;//密码中不必含有特殊字符options.Password.RequireUppercase = false;//密码中不必含有大写字母options.Password.RequiredLength = 12;//密码长度要求最少为12位数据//密码重设规则options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;//邮箱激活规则 options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;options.User.RequireUniqueEmail=true;//必须使用唯一邮箱options.Lockout.MaxFailedAccessAttempts = 3;//3次错误登录将会被锁定,默认数值是5次options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromSeconds(10);//达到锁定标准时,将会锁定10分钟,默认锁定时间是5分钟});services.AddDataProtection();//EFCore 和Identity提供的IdentityDbContext 提供关联,这步非常关键。var idbuilder = new IdentityBuilder(typeof(MyUser), typeof(MyRole), services);idbuilder.AddEntityFrameworkStores<IdentityDemoDBContext>().AddDefaultTokenProviders().AddRoleManager<RoleManager<MyRole>>().AddUserManager<UserManager<MyUser>>();#endregion

尽管我们可以操作DbContext上下文,不过Identity 框架还提供了 RoleManager、UserManage类来简化数据库的操作。因此上述服务中还注入了RoleManager。UserManager的服务

经过上述配置后,使用迁移命令 A d d − M i g r a t i o n / U p d a t e − d a t a b a s e ,同步到实际数据库中,将会生成以下表信息 \textcolor{red}{经过上述配置后,使用迁移命令Add-Migration/Update-database ,同步到实际数据库中,将会生成以下表信息} 经过上述配置后,使用迁移命令AddMigration/Updatedatabase,同步到实际数据库中,将会生成以下表信息

在这里插入图片描述

上述表将有Identity框架管理,不需要开发人员直接的去访问这些表

3 AspNetCore中使用Identity框架

    [Route("/api/[controller]/[action]")]public class UserController:ControllerBase{private readonly UserManager<MyUser> userManager;private readonly RoleManager<MyRole> roleManager;public UserController(UserManager<MyUser> userManager, RoleManager<MyRole> roleManager) {this.userManager = userManager;this.roleManager = roleManager;}/// <summary>/// 创建用户并关联角色/// </summary>/// <param name="username">用户名称</param>/// <param name="password">密码</param>/// <param name="mail">邮箱地址</param>/// <returns></returns>[HttpPost]public async Task<IActionResult> CreateUser(string username,string password,string mail) {MyRole role=await roleManager.FindByNameAsync("admin");if (role == null) {//创建角色role=new MyRole() { Name="admin"};IdentityResult res= await roleManager.CreateAsync(role);if (!res.Succeeded) {return BadRequest(res.Errors);}}MyUser user= await userManager.FindByEmailAsync(mail);if (user == null) {//新建用户user = new MyUser(){Email = mail,UserName = username};IdentityResult res=   await userManager.CreateAsync(user,password);if (!res.Succeeded){return BadRequest(res.Errors);}//关联角色信息await userManager.AddToRoleAsync(user,"admin");if (!res.Succeeded){return BadRequest(res.Errors);}}return new OkResult();}/// <summary>/// 用户登录/// </summary>/// <param name="username"></param>/// <param name="password"></param>/// <returns></returns>[HttpPost]public async Task<IActionResult> Login(string username, string password) {MyUser user = await userManager.FindByNameAsync(username);if (user == null) {return BadRequest("用户名错误");}//校验密码是否正确bool res = await userManager.CheckPasswordAsync(user, password);if (!res){await userManager.AccessFailedAsync(user); //AccessFailedAsync 会记录一次失败登录,当多次登录失败后,账户将会被锁定一段时间,以避免账户被暴力破解return BadRequest("密码错误");}return new OkResult();}/// <summary>/// 向邮箱发送重置密码的token/// </summary>/// <param name="mail"></param>/// <returns></returns>[HttpPost]public async Task SendResetPasswordToken(string mail) {MyUser user= await    userManager.FindByEmailAsync(mail);string token= await userManager.GeneratePasswordResetTokenAsync(user);Console.WriteLine("向邮箱{0}发送的验证token串为{1}",mail,token);}/// <summary>/// 重置密码/// </summary>/// <param name="mail"></param>/// <param name="token"></param>/// <param name="newPassword"></param>/// <returns></returns>[HttpPost]public async Task<IdentityResult> ResetPassword(string mail, string token, string newPassword) {MyUser user = await userManager.FindByEmailAsync(mail);return await userManager.ResetPasswordAsync(user,token, newPassword);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/330792.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建数字未来:探索Web3在物联网中的新视角

引言 随着Web3时代的来临&#xff0c;物联网技术正迎来一场新的变革。在这个数字化时代&#xff0c;Web3所带来的技术创新将为物联网的发展开辟新的视角。本文将深入探讨Web3在物联网领域的应用&#xff0c;揭示其在构建数字未来中的重要性和影响。 Web3与物联网的融合 区块链…

Golang项目代码组织架构实践

Golang在项目结构上没有强制性规范&#xff0c;虽然这给了开发者很大的自由度&#xff0c;但也需要自己沉淀一套可行的架构。本文介绍了一种项目布局&#xff0c;可以以此为参考设计适合自己的 Golang 项目组织模式。原文: Golang Project Layout Go 有很多强制的或是约定俗成的…

如何运用多媒体,打造企业实力展示厅?

企业文化、产品是其长期发展的根本所在&#xff0c;为此越来越多的企业开始选择运用多媒体互动&#xff0c;来打造企业多媒体展厅的方式&#xff0c;对企业文化、品牌形象、产品进行推广宣传&#xff0c;并在多媒体互动装置的支持下&#xff0c;能让客户能够快速且全面的了解企…

【设计模式】JAVA Design Patterns——Converter(转换器模式)

&#x1f50d;目的 转换器模式的目的是提供相应类型之间双向转换的通用方法&#xff0c;允许进行干净的实现&#xff0c;而类型之间无需相互了解。此外&#xff0c;Converter模式引入了双向集合映射&#xff0c;从而将样板代码减少到最少 &#x1f50d;解释 真实世界例子 在真实…

cocos 写 连连看 小游戏主要逻辑(Ts编写)算法总结

cocos官方文档&#xff1a;节点系统事件 | Cocos Creator 游戏界面展示 一、在cocos编译器随便画个页面 展示页面 二、连连看元素生成 2.1、准备单个方块元素&#xff0c;我这里就是直接使用一张图片&#xff0c;图片大小为100x100&#xff0c;锚点为&#xff08;0&#xff0…

【Linux-驱动开发】

Linux-驱动开发 ■ Linux-应用程序对驱动程序的调用流程■ Linux-file_operations 结构体■ Linux-驱动模块的加载和卸载■ 1. 驱动编译进 Linux 内核中■ 2. 驱动编译成模块(Linux 下模块扩展名为.ko) ■ Linux-■ Linux-■ Linux-设备号■ Linux-设备号-分配■ 静态分配设备号…

Unity Physics入门

概述 在unity中物理属性是非常重要的&#xff0c;它可以模拟真实物理的效果在unity中&#xff0c;其中的组件是非常多的&#xff0c;让我们来学习一下这部分的内容吧。 Unity组件入门篇总目录----------点击导航 Character Controller(角色控制) 说明&#xff1a;组件是Unity提…

运算符重载(上)

目录 运算符重载日期类的比较判断日期是否相等判断日期大小 赋值运算符重载赋值运算符重载格式赋值运算符只能重载成类的成员函数不能重载成全局函数用户没有显式实现时&#xff0c;编译器会生成一个默认赋值运算符重载&#xff0c;以值的方式逐字节拷贝 感谢各位大佬对我的支持…

微信小程序反编译/解包

微信小程序反编译/解包 环境与工具 操作系统&#xff1a;Windows 11 23H2 微信版本&#xff1a;3.9.10.19 Q&#xff1a;如何找到小程序文件位置&#xff1f; A&#xff1a;在微信的设置找到文件路径&#xff0c;小程序文件位于 \WeChat Files\Applet\。 Q&#xff1a;小程…

web前端的路径和Servlet注解开发

目录 在web前端的两种路径 绝对路径的两种写法 相对路径 相对路径进阶 使用注解开发Servlet 使用注解开发Servlet的注意事项 使用idea创建servlet模板 在web前端的两种路径 绝对路径的两种写法 1.带网络三要素 http://ip地址:端口号/资源路径 2.不带网络三要素 /资源路…

Ps:消失点滤镜 - 选区操作

Ps菜单&#xff1a;滤镜/消失点 Filter/Vanishing Point 快捷键&#xff1a;Ctrl Alt V 当在“消失点”滤镜中进行绘画或修饰以校正缺陷、添加元素或改进图像时&#xff0c;可使用选区提供帮助。 通过建立选区&#xff0c;可在图像中绘制或填充特定区域的同时采用图像中的平面…

Linux之单机项目部署

1、虚拟机&#xff08;VMware&#xff09;创建Linux系统 1.1、创建虚拟机 1.2、配置虚拟机IOS映射文件 1.3、虚拟机内部相关配置 等待加载即可&#xff0c;加载完后会弹出图形化界面&#xff0c;如图&#xff1a; 注意&#xff1a;一般我们做为管理员使用ROOT账号来操作&#x…

利用sql注入对某非法网站的渗透

本文仅用于技术讨论&#xff0c;切勿用于违法途径&#xff0c;且行且珍惜&#xff0c; 所有非经授权的渗透&#xff0c;都是违法行为 前言 这段时间一直在捣鼓sql注入&#xff0c;最近又通过一个sql注入点&#xff0c;成功进入某个非法网站的后台&#xff0c;拿到整个网站的…

力扣654. 最大二叉树

Problem: 654. 最大二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 对于构造二叉树这类问题一般都是利用先、中、后序遍历&#xff0c;再将原始问题分解得出结果 1.定义递归函数build&#xff0c;每次将一个数组中的最大值作为当前子树的根节点构造二叉树&#xff1b;…

动静态库

说明&#xff1a;使用动静态库&#xff0c;一般直接安装即可&#xff0c;其他使用方法了解即可 静态库 静态库&#xff08;Static Library&#xff09;是一种将代码和数据打包成一个单独的文件的库文件&#xff0c;主要用于编译时的链接&#xff0c;而不是运行时。静态库通常…

手撕算法|斯坦福大学教授用60页PPT搞定了八大神经网络

人工智能领域深度学习的八大神经网络常见的是以下几种 1.卷积神经网络&#xff08;CNN&#xff09;&#xff1a; 卷积神经网络是用于图像和空间数据处理的神经网络&#xff0c;通过卷积层和池化层来捕捉图像的局部特征&#xff0c;广泛应用于图像分类、物体检测等领域。 2.循…

springcloud第4季 springcloud-gateway网关predict案例场景

一 predict案例场景 1.1 说明 本博客所有案例操作&#xff0c;都在上篇博客的基础上进行&#xff1a; springcloud第4季 springcloud-gateway网关的功能作用_cloud gateway干嘛的-CSDN博客 1.2 案例前提准备 1. 启动zipkin服务 2.启动consul服务 3.启动3个应用服务 二 …

【产品经理】如何培养对市场的洞察力

引言&#xff1a;        在最近频繁的产品管理职位面试中&#xff0c;我深刻体会到了作为产品经理需要的不仅仅是对市场和技术的敏锐洞察&#xff0c;更多的是在复杂多变的环境中&#xff0c;如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享…

Linux——进程与线程

进程与线程 前言一、Linux线程概念线程的优点线程的缺点线程异常线程用途 二、Linux进程VS线程进程和线程 三、Linux线程控制创建线程线程ID及进程地址空间布局线程终止线程等待分离线程 四、习题巩固请简述什么是LWP请简述LWP与pthread_create创建的线程之间的关系简述轻量级进…

揭秘!亚马逊、Vinted卖家如何借助自养号测评实现爆单?

​作为一名跨境卖家&#xff0c;你一定梦想着能够在亚马逊上实现爆单&#xff0c;让产品火爆销售。下面就分享五个秘诀&#xff0c;帮助你实现这个梦想&#xff1a; 1. 优质产品&#xff1a;首先&#xff0c;确保你的产品质量优秀&#xff0c;能够满足消费者的需求。品质好的产…