当前位置: 首页 > article >正文

ASP.NET Core标识框架Identity

目录

Authentication与Authorization

标识框架(Identity)

Identity框架的使用

初始化

自定义属性

案例一:添加用户、角色

案例二:检查登录用户信息

案例三:实现密码的重置

步骤


Authentication与Authorization

Authentication对访问者的用户身份进行验证,“用户是否登录成功”。

Authorization验证访问者的用户身份是否有对资源访问的访问权限,“用户是否有权限访问这个地址”。

标识框架(Identity)

标识(Identity)框架:采用基于角色的访问控制(Role-Based Access Control,简称RBAC)策略,内置了对用户、角色等表的管理以及相关的接口,支持外部登录、2FA等。

标识框架使用EF Core对数据库进行操作,因此标识框架支持几乎所有数据库。

Identity框架的使用

  1. IdentityUser<TKey>、IdentityRole<TKey>,TKey代表主键的类型。我们一般编写继承自IdentityUser<TKey>、IdentityRole<TKey>等的自定义类,可以增加自定义属性。
  2. NuGet:Microsoft.AspNetCore.Identity.EntityFrameworkCore。
  3. 创建继承自IdentityDbContext的类
  4. 可以通过IdDbContext类来操作数据库,不过框架中提供了RoleManager、UserManager等类来简化对数据库的操作。
  5. 部分方法的返回值为Task<IdentityResult>类型

初始化

初始化完执行数据库迁移操作

public class MyUser:IdentityUser<long>
{
}
public class MyRole:IdentityRole<long>
{
}
public class MyDbContext:IdentityDbContext<MyUser,MyRole,long>
{public MyDbContext(DbContextOptions<MyDbContext> options) : base(options){}
}Program.cs
//添加数据库上下文
builder.Services.AddDbContext<MyDbContext>(opt => {string connStr = Environment.GetEnvironmentVariable("ConnStr");opt.UseSqlServer(connStr);
});
//添加数据保护服务
builder.Services.AddDataProtection();
//添加身份认证服务
builder.Services.AddIdentityCore<MyUser>(options => {//设置密码规则,不需要数字,小写字母,大写字母,特殊字符,长度为6options.Password.RequireDigit = false;options.Password.RequireLowercase = false;options.Password.RequireUppercase = false;options.Password.RequireNonAlphanumeric = false;options.Password.RequiredLength = 6;//设置密码重置令牌提供程序为默认的电子邮件提供程序options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;//设置电子邮件确认令牌提供程序为默认的电子邮件提供程序options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
});
//添加实体框架、默认令牌提供程序、角色管理器、用户管理器
var idBuilder = new IdentityBuilder(typeof(MyUser), typeof(MyRole), builder.Services);
idBuilder.AddEntityFrameworkStores<MyDbContext>().AddDefaultTokenProviders().AddRoleManager<RoleManager<MyRole>>().AddUserManager<UserManager<MyUser>>();

自定义属性

public class MyUser:IdentityUser<long>
{public string? WeChatAccout { get; set; }
}

案例一:添加用户、角色

通过RoleManager、UserManager等来进行数据操作,创建用户:小明,角色:admin,为小明添加admin角色

[Route("api/[controller]/[action]")]
[ApiController]
public class DemoContrller : ControllerBase
{private readonly UserManager<MyUser> userManager;private readonly RoleManager<MyRole> roleManager;public DemoContrller(UserManager<MyUser> userManager, RoleManager<MyRole> roleManager){this.userManager = userManager;this.roleManager = roleManager;}[HttpPost]public async Task<ActionResult<string>> Test1(){if (!await roleManager.RoleExistsAsync("admin")){var result = await roleManager.CreateAsync(new MyRole { Name = "admin" });if (!result.Succeeded){return BadRequest("角色创建失败");}}MyUser user1 = await userManager.FindByNameAsync("小明");if (user1 == null){var result = await userManager.CreateAsync(new MyUser { UserName = "小明" }, "123456");if (!result.Succeeded){return BadRequest("用户创建失败");}}if(!await userManager.IsInRoleAsync(user1, "admin")){var result = await userManager.AddToRoleAsync(user1, "admin");if (!result.Succeeded){return BadRequest("用户添加角色失败");}}return Ok("测试成功");}
}

案例二:检查登录用户信息

userManager.AccessFailedAsync记录“登录失败”,多次失败后,会被锁定一段时间,以避免账号被暴力破解,默认锁定时间5分钟,失败次数5次,,可以在Program.cs中设置options.Lockout.DefaultLockoutTimeSpanoptions.Lockout.MaxFailedAccessAttempts来修改默认值

[HttpPost]
public async Task<ActionResult<string>> Test2(CheckPwdRequest req)
{string userName = req.UserName;string password = req.Password;var user = await userManager.FindByNameAsync(userName);if (user == null){return BadRequest("用户或密码错误");}//await userManager.ResetAccessFailedCountAsync(user);if (await userManager.IsLockedOutAsync(user)){DateTimeOffset lockout = (DateTimeOffset)user.LockoutEnd + new TimeSpan(8, 0, 0);return BadRequest(DateTime.Now + "用户已被锁定,解锁时间" + lockout);}if (await userManager.CheckPasswordAsync(user, password)){await userManager.ResetAccessFailedCountAsync(user);return Ok("登录成功");}else{await userManager.AccessFailedAsync(user);return BadRequest("用户或密码错误");}
}

案例三:实现密码的重置

调用GeneratePasswordResetTokenAsync方法来生成密码重置令牌,实际项目中,邮件发送一般调用邮件服务提供商的接口,这里只是简单输出到控制台,默认生成的令牌很长,我们可以在Project.cs设置options.Tokens.PasswordResetTokenProvider属性的值

步骤
  1. 生成重置Token
  2. Token发给客户(邮件、短信等),形式:链接、验证码等。
  3. 根据Token完成密码的重置。
[HttpPost]
public async Task<ActionResult> SendResetPasswordToken(string userName)
{var user = await userManager.FindByNameAsync(userName);if (user == null){return BadRequest("用户名不存在!");}string token = await userManager.GeneratePasswordResetTokenAsync(user);Console.WriteLine($"向邮箱{user.Email}发送Token={token}");return Ok(token);
}[HttpPut]
public async Task<ActionResult> ResetPassword(string userName, string token, string newPassword)
{var user = await userManager.FindByNameAsync(userName);if (user == null){return BadRequest("用户名不存在!");}var result = await userManager.ResetPasswordAsync(user, token, newPassword);if (result.Succeeded){await userManager.ResetAccessFailedCountAsync(user);return Ok("密码重置成功");}else{await userManager.AccessFailedAsync(user);return BadRequest("密码重置失败");}
}

相关文章:

ASP.NET Core标识框架Identity

目录 Authentication与Authorization 标识框架&#xff08;Identity&#xff09; Identity框架的使用 初始化 自定义属性 案例一&#xff1a;添加用户、角色 案例二&#xff1a;检查登录用户信息 案例三&#xff1a;实现密码的重置 步骤 Authentication与Authorizatio…...

PFAS(全氟烷基和多氟烷基物质)测试流程详细介绍

PFAS&#xff08;全氟烷基和多氟烷基物质&#xff09;测试详细介绍 什么是PFAS&#xff1f; PFAS是(Per-and polyfluoroalkyl substances)的简称&#xff0c;中文名&#xff1a;全氟烷基和多氟烷基物质&#xff0c;是一系列合成有机氟化物的总称&#xff0c;是指至少含有一个…...

宝塔面板端口转发其它端口至MySQL的3306

最近需要把服务器的MySQL服务开放给外网&#xff0c;但又希望公开给所有人。也不想用默认的3306端口。同时也不想改变MySQL的默认端口。 这时候最好的办法就是用一个不常用的端口来转发至3306上去。例如使用49306至3306&#xff0c;外网通过49306来访问&#xff0c;内网依然使用…...

inquirer介绍及配合lerna在Vue中使用示例

目录 安装基本用法使用多个提示框动态选择&#xff08;动态选项&#xff09;表单式输入配合lerna在Vue中使用示例 Inquirer 是一个用于创建交互式命令行工具的 Node.js 库&#xff0c;常用于收集用户输入。它提供了多种类型的提示框&#xff0c;可以用于创建交互式应用程序&…...

AI商业化:如何包装技术并找到客户需求?

AI商业化:如何包装技术并找到客户需求? 适用人群:对人工智能技术有一定沉淀,正在探索技术变现和商业模式创新的创业者、技术团队以及企业管理者。同时也适合对 AI 产品包装、市场调研与用户调研感兴趣的从业人员。 一、引言 在过去几年里,从 GPT、Transformer 到 DeepSee…...

基于MODIS/Landsat/Sentinel/国产卫星遥感数据与DSSAT作物模型同化的作物产量估算

基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具&#xff0c;可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系&#xff0c;为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了…...

OpenAI 宣布免费开放 ChatGPT 搜索,无需注册

在科技飞速发展的今天&#xff0c;人工智能领域的每一次突破都犹如一颗重磅炸弹&#xff0c;震撼着整个世界。北京时间 2025 年 2 月 6 日凌晨&#xff0c;OpenAI 宣布向所有用户开放 ChatGPT 搜索功能&#xff0c;且无需注册&#xff0c;这一消息瞬间引发了全球范围内的广泛关…...

如何打开vscode系统用户全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用户配置文件&#xff0c;它存储了 编辑器的个性化设置&#xff0c;包括界面布局、代码格式化、扩展插件、快捷键等&#xff0c;是用户全局配置&#xff08;影响所有…...

DeepSeek-V3本地Docker容器化部署

1. 安装Docker 确保已安装Docker Desktop for Mac&#xff1a; 下载并安装 Docker Desktop。 安装完成后&#xff0c;启动Docker Desktop。 验证安装&#xff1a; docker --version docker-compose --version 2. 克隆DeepSeek-V3仓库 git clone https://github.com/deeps…...

【Leetcode 每日一题】47. 全排列 II

问题背景 给定一个可包含重复数字的序列 n u m s nums nums&#xff0c;按任意顺序 返回所有不重复的全排列。 数据约束 1 ≤ n u m s . l e n g t h ≤ 8 1 \le nums.length \le 8 1≤nums.length≤8 − 10 ≤ n u m s [ i ] ≤ 10 -10 \le nums[i] \le 10 −10≤nums[i]≤…...

【Uniapp-Vue3】从uniCloud中获取数据

需要先获取数据库对象&#xff1a; let db uniCloud.database(); 获取数据库中数据的方法&#xff1a; db.collection("数据表名称").get(); 所以就可以得到下面的这个模板&#xff1a; let 函数名 async () > { let res await db.collection("数据表名称…...

【重生之学习C语言----杨辉三角篇】

目录 ​编辑 --------------------------------------begin---------------------------------------- 一、什么是杨辉三角&#xff1f; 二、问题分析 三、算法设计 使用二维数组存储杨辉三角&#xff1a; 递推关系&#xff1a; 格式化输出&#xff1a; 四、代码实现 完…...

天童教育:帮助孩子建立稳定的自信心

不少家长发现&#xff0c;自己家孩子不知道从什么时候开始&#xff0c;不再自信了。有些孩子在面对挑战时总是畏缩不前&#xff0c;不敢尝试新事物&#xff1b;在众人面前发言时&#xff0c;声音微弱&#xff0c;眼神闪躲。昆明天童教育认为&#xff0c;这些表现往往是孩子自信…...

LabVIEW自定义测量参数怎么设置?

以下通过一个温度采集案例&#xff0c;说明在 LabVIEW 中设置自定义测量参数的具体方法&#xff1a; 案例背景 ​ 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度&#xff0c;需自定义以下参数&#xff1a; 采样率&#xff1a;1 kHz 输入量程&#xff1a;0~10 V&a…...

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…...

SpringCloud详细讲解

学习目标 微服务框架SpringCloud的核心组件分布式与集群Spring Cloud 优缺点 微服务框架 微服务框架是将某个应用程序开发划分为多个小型服务独立进行业务开发的一种架构模式。以下是对微服务框架的详细介绍&#xff1a; 一、定义与特点 定义&#xff1a;微服务框架围绕业务…...

使用 OpenGL ES 在 iOS 上渲染一个四边形:从基础到实现

使用 OpenGL ES 在 iOS 上渲染一个四边形&#xff1a;从基础到实现 在 iOS 开发中&#xff0c;OpenGL ES 是一个强大的工具&#xff0c;用于实现高性能的 2D 和 3D 图形渲染。本文将详细分析一段完整的代码&#xff0c;展示如何使用 OpenGL ES 在 iOS 上渲染一个简单的四边形。…...

98.2 AI量化开发:基于DeepSeek打造个人专属金融消息面-AI量化分析师(理论+全套Python代码)

目录 0. 承前1. 金融工程结构图2. Why is DeepSeek3. 项目实现代码3.1 导入python库3.2 参数设置3.3 获取数据3.4 数据处理3.5 AI人设提示词3.6 Messages构建3.7 AI Agent3.8 response格式处理3.9 汇总函数3.10 运行案例 4. 总结4.1 系统优点4.2 系统缺点4.3 可提升方向 0. 承前…...

复制粘贴小工具——Ditto

在日常工作中&#xff0c;复制粘贴是常见的操作&#xff0c;但Windows系统自带的剪贴板功能较为有限&#xff0c;只能保存最近一次的复制记录&#xff0c;这对于需要频繁复制粘贴的用户来说不太方便。今天&#xff0c;我们介绍一款开源、免费且功能强大的剪贴板增强工具——Dit…...

中国人名汉语拼音字母拼写规则

中国人名汉语拼音字母拼写规则 1. Lv and Lyu2. 中国人名汉语拼音字母拼写规则References 1. Lv and Lyu LongBench: A Bilingual, Multitask Benchmark for Long Context Understanding https://arxiv.org/abs/2308.14508 2. 中国人名汉语拼音字母拼写规则 http://www.moe.g…...

MAC OS安装Homebrew

文章目录 1.下载Homebrew2.完成安装3.验证安装4.更新 Homebrew作为一个包管理器&#xff0c;提供了一种简便的方式来安装、更新和卸载各种命令行工具和应用程序。相比于手动下载和编译源代码&#xff0c;或者从不同的网站下载安装包&#xff0c;使用Homebrew可以显著减少这些操…...

计算机组成原理——存储系统(四)

当晨曦的第一缕光线划破夜空&#xff0c;那是宇宙给奋斗者的信号——光明属于那些在黑暗中依旧寻找希望的人。在这条通往梦想的道路上&#xff0c;每一步都充满挑战&#xff0c;但正是这些挑战定义了你的坚韧与不屈。不要满足于现状&#xff0c;因为你的潜力远超想象&#xff1…...

飞算JavaAI:开辟 AI + 行业趋势的编程新范式

在当今数字化浪潮汹涌澎湃的时代&#xff0c;科技的快速发展正以前所未有的速度重塑着各个行业的面貌。人工智能&#xff08;AI&#xff09;作为其中最具变革性的力量之一&#xff0c;已经深入渗透到众多领域&#xff0c;从金融、医疗到制造业、教育等&#xff0c;无一不在经历…...

Axure PR 9 动效 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们来用Axure制作一组动效。 动效 创建动效元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.选中画布&#xff0c;将画布填充颜色设置为蓝色(#0052D9)。 3.在元件库中拖出一个圆形元件&#xff0c;选中矩形元件&…...

DeepSeek 本地部署

DeepSeek 本地部署 一、引言二、为什么选择本地部署 DeepSeek&#xff1f;三、具体步骤1.下载Ollama并安装&#xff08;Ollama 提供 API 支持&#xff09;2. 部署 deepseek-r12.下载Chatbox并配置为本地DeepSeek &#xff08;Chatbox 提供 UI 界面&#xff09; 一、引言 近期&…...

langchain教程-3.OutputParser/输出解析

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...

JavaScript系列(62)--实时通信系统实现详解

JavaScript实时通信系统实现详解 &#x1f504; 今天&#xff0c;让我们深入探讨JavaScript的实时通信系统实现。实时通信是现代Web应用中不可或缺的一部分&#xff0c;它能够提供即时的数据交互和更好的用户体验。 WebSocket通信基础 &#x1f31f; &#x1f4a1; 小知识&am…...

网络工程师 (20)计算机网络的概念

一、定义 计算机网络是指将地理位置不同、具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路及通信设备连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现信息传递和资源共享的计算机通信系统。 二、组成 资源子网&…...

Unity UI Default Shader分析

文章目录 UI默认材质和Default ShaderShader的属性定义Mask组件支持RectMask2D组件支持其他支持使用Unity UGUI时经常有自定义shader的需求,虽然我们可以直接按照shader lab的规范写出shader,使用也没问题,但如果能让自定义shader符合UI shader的规范,支持Mask,Rect2DMask…...

IEEE 802.3/802.2 | LLC / SNAP

注&#xff1a;本文为 “IEEE 802.3/802.2 | LLC / SNAP” 相关文章合辑。 未整理去重。 第三篇部分内容出自第二篇。 802.2 协议 haoay321 2010-01-28 20:52:02 LLC 协议 LLC&#xff08;Logic Link Control&#xff0c;逻辑链路控制&#xff09;是 IEEE 802.2 协议中规定…...