从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用

创建Token

创建token的因素(条件)有很多,在该篇文章中,采用jwt配置和用户基本信息作为生成token的基本因素(读者可根据系统,自由改变生成token因素)。

在JwtPlugInUnit.CS中创建2个方法(JwtPlugInUnit.CS在上一篇文章中有写到)

方法一:PropValuesType方法

/// <summary>
/// 反射获取字段
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static IEnumerable<(string Name, object Value, string Type)> PropValuesType(this object obj)
{List<(string a, object b, string c)> result = new List<(string a, object b, string c)>();var type = obj.GetType();var props = type.GetProperties();foreach (var item in props){result.Add((item.Name, item.GetValue(obj), item.PropertyType.Name));}return result;
}

上述方法:PropValuesType是通过反射获取模型字段和属性。在本文章中,是为了提取登录人员信息,编写成List<Claim>,组成生成token的因素之一。

方法二:BuildToken方法

/// <summary>
/// 生成Token
/// </summary>
/// <param name="loginResult">登陆返回信息</param>
/// <returns></returns>
public static LoginOutPut BuildToken(LoginInput loginResult)
{LoginOutPut result = new LoginOutPut();//获取配置var jwtsetting = AppSettingsPlugInUnit.GetNode<JwtSettingModel>("JwtSetting");//准备calims,记录登录信息var calims = loginResult.PropValuesType().Select(x => new Claim(x.Name, x.Value.ToString(), x.Type)).ToList();//创建headervar key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsetting.SecurityKey));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);var header = new JwtHeader(creds);//创建payloadvar payload = new JwtPayload(jwtsetting.Issuer, jwtsetting.Audience, calims, DateTime.Now, DateTime.Now.AddMinutes(jwtsetting.ExpireSeconds));//创建令牌 var token = new JwtSecurityToken(header, payload);var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);result.ExpiresDate = token.ValidTo.AddHours(8).ToString();result.Token = tokenStr;result.UserName = loginResult.UserName;return result;
}

上述方法:BuildToken是创建token的核心代码,它通过用户信息+jwt配置信息生成token,并返回token、用户名、token过期时间等信息(读者可以添加更多返回信息)。

BuildToken中有2个模型,具体结构和位置如下:

创建Model类,用于存放系统中模型。

LoginInput模型结构如下:

/// <summary>
/// 登录输入模型
/// </summary>
public class LoginInput
{/// <summary>/// 用户名/// </summary>public string? UserName { get; set; }/// <summary>/// 密码/// </summary>public string? Password { get; set; }}

LoginOutPut模型结构如下:

/// <summary>/// 登录输入模型/// </summary>public class LoginOutPut{/// <summary>/// 用户名/// </summary>public string? UserName { get; set; }/// <summary>/// 密码/// </summary>public string? Password { get; set; }/// <summary>/// Token/// </summary>public string? Token { get; set; }/// <summary>/// Token过期时间/// </summary>public string? ExpiresDate { get; set; }}

做完以上操作,用户就可以生成Token,但要把token运用到系统中,还需做以下操作。

创建模块分组

在ModeuleGroupEnum.cs中创建2个枚举,具体如下

/// <summary>/// 模块分组/// </summary>public enum ModeuleGroupEnum{/// <summary>/// 系统菜单/// </summary>SysMenu = 1,/// <summary>/// 系统用户/// </summary>SysUser = 2,/// <summary>/// 基础/// </summary>Base = 3,}

新增【系统用户】、【基础】2个枚举。

创建新控制器

创建2个控制器:BaseController和SysUserController,结构如下

创建BaseController基础控制器,它存在的作用,就是承担系统中需要重写方法和获取用户基本信息的桥梁。

代码如下:

/// <summary>
/// 系统基础模块
/// </summary>
[ApiController]
[Route("api/[controller]/[action]")]
[ApiExplorerSettings(GroupName = nameof(ModeuleGroupEnum.Base))]
[Authorize]
public class BaseController : ControllerBase
{/// <summary>/// 获取登陆人员信息/// </summary>/// <returns></returns>[HttpGet]public LoginOutPut GetLoginUserMsg(){StringValues s = new StringValues();var auth = Request.Headers.TryGetValue("Authorization", out s);if (string.IsNullOrWhiteSpace(s))throw new Exception("登录信息失效");var token = new JwtSecurityTokenHandler().ReadJwtToken(s.ToString().Replace($"{JwtBearerDefaults.AuthenticationScheme} ", ""));LoginOutPut loginResult = new(){UserName = token.Claims.FirstOrDefault(f => f.Type == "UserName").Value,Password = Convert.ToString(token.Claims.FirstOrDefault(f => f.Type == "Password").Value),};return loginResult;}
}

解读下该方法:通过获取Headers中的Token,然后使用jwt反解析token获取在BuildToken方法中记录的用户基本信息。

说明:控制器上方存在[Authorize],只要有控制器继承基础控制【BaseController】,那么该控制器下的所有方法,都需要经过jwt验证。如果某一个接口不需要token验证,就在该接口上方添加 [AllowAnonymous]

创建SysUserController控制器,并继承BaseController控制器,它的作用就是承担系统用户的所有接口,具体代码如下:

/// <summary>/// 用户模块/// </summary>[ApiController][Route("api/[controller]/[action]")][ApiExplorerSettings(GroupName = nameof(ModeuleGroupEnum.SysUser))]public class SysUserController : BaseController{/// <summary>/// 获取Token/// </summary>/// <param name="userName">用户名</param>/// <param name="password">密码</param>[HttpGet][AllowAnonymous]public string GetToken(string userName, string password){var loginResult = JwtPlugInUnit.BuildToken(new LoginInput { UserName = userName, Password = password });return loginResult.Token ?? string.Empty;}}

可以看到,该控制器下有2个接口,一个为获取token接口(可同时作为登录接口),一个为获取登录人员信息的接口(继承BaseController下的GetLoginUserMsg()方法)。

做完以上操作,jwt中token验证就完成啦,看一下成果。

不使用token访问接口,不会成功

先获取token

在添加使用token

点击Authorize确定使用

再次访问GetLoginUserMsg()接口,看下效果

文章转载自:陈逸子风

原文链接:https://www.cnblogs.com/cyzf/p/18422784

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大模型常见面试题汇总(含答案),非常详细收藏我这一篇就够了

最近秋招正在如火如荼地进行中&#xff0c;看到很多人的简历上都包含大模型相关的工作&#xff0c;各家大厂和初创都很舍得给钱&#xff0c;动辄百万年包也变得不再稀奇。 因此在大模型纵横的这个时代&#xff0c;不仅大模型技术越来越卷&#xff0c;就连大模型相关的岗位和面…

USB 电缆中的信号线 DP、DM 的缩写由来

经常在一些芯片的规格书中看到 USB 的信号对是以 DP 和 DM 命名&#xff1a; 我在想&#xff0c;这些规格书是不是写错了&#xff0c;把 N 写成 M 了&#xff1f;DM 中的 M 到底是什么的缩写&#xff1f; 于是我找了一些资料&#xff0c;终于在《Universal Serial Bus Cables …

‘艾’公益——微笑行动「毕节站」为艾祝福,让笑起舞

艾多美“微笑行动”毕节站拉开帷幕 此次爱心帮助77名唇腭裂患儿 重新绽放微笑 不让笑容留有缺憾 每个孩子都有微笑的权利 艾多美向唇腭裂儿童伸出援手 绽放笑容&#xff0c;拥抱全新的未来 2024年9月18日-9月23日&#xff0c;毕节市妇幼保健院迎来了艾多美--微笑行动项目…

MES系统如何集成到ERP系统里

MES系统&#xff08;制造执行系统&#xff09;集成到ERP系统&#xff08;企业资源计划&#xff09;里是一个复杂但至关重要的过程&#xff0c;它有助于企业实现生产计划、物料追踪、质量控制和数据分析的无缝协作&#xff0c;从而提高生产效率和产品质量。以下是MES系统集成到E…

8086的指令系统

今天上午综测答辩结束&#xff0c;感觉就很一般&#xff0c;但是我昨晚也操心到觉都没睡好&#xff0c;今天中午舍友玩P5吵得我也没睡着&#xff0c;感觉脑袋昏昏沉沉&#xff0c;汇编上课没认真听讲&#xff0c;晚上来补一补。还是采用GPT来讲解&#xff08;水文字&#xff09…

显示屏显示缺陷检测系统源码分享

显示屏显示缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

k8s前置准备:配置虚拟机网络

目录 前言查看本机ip地址修改虚拟机配置修改linux配置配置其余linux机器的网络参考文献 前言 本文的最终目的是使虚拟机内可以访问互联网&#xff0c;虚拟机之间可以互相访问。 虚拟机使用的是vmware&#xff0c;环境是windows&#xff0c;虚拟镜像是linux系统。 使用桥接模式…

企业微信VS钉钉:高效办公工具推荐!

这两者各有千秋&#xff0c;适合不同的办公场景。企业微信的优势在于与微信的紧密集成&#xff0c;便于与客户沟通&#xff0c;适合需要频繁与外部联系的企业。它提供了基本的办公自动化功能&#xff0c;如团队协作、审批、日程等。 钉钉则在企业管理和团队协作方面功能更全面…

Snubber电路设计

思路总结&#xff1a; 1.根据测试和推算得出FRA(震荡频率)&#xff0c;进而推算出Cp(寄生电容)&#xff0c;再根据LRC关系式推算出LP和CP,后续的Csn(吸收电容)和Rsn(吸收电阻)。得出初步的参数然后再PCBA上进行微调就可以实现通用Snub电路的设计。

解决Mac 默认设置 wps不能双面打印的问题

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 使用mac电脑的时候&#xff0c;发现wps找不到双面打印的按钮&#xff0c;导致使用wps打开的所有文件都不能自动双面打印 问题解决&#xff1a; mac的wps也是有双面打印的选项&#xff0c;只是默认被关…

clinvar中ReviewStatus

ReviewStatus, character, review status for the aggregate germline classification for this variant. For the key to the terms, and the stars displayed on ClinVar web pages 详细介绍: Number of gold starsReview statusDescriptionfourpractice guidelineThere is …

【JavaScript】LeetCode:51-55

文章目录 51 验证二叉搜索树52 二叉搜索树中第k小的元素53 二叉树的右视图54 二叉树展开为链表55 从前序与中序遍历序列构造二叉树 51 验证二叉搜索树 递归对二叉搜索树进行中序遍历&#xff0c;输出节点的值是单调递增的。方法1&#xff1a;对二叉树进行中序遍历&#xff0c;将…

若依_配置三级菜单或多级菜单

若依直接在router文件里配置的&#xff0c;没有在若依的菜单管理里配 然后也出现了上面链接里的那个中出现头部、左侧菜单和面包屑的情况 完整代码 {path: /zichan,meta: { title: 零星资产处置审批, icon: dashboard, affix: true, noCache: true },component: Layout,// red…

WebRtc实际应用

1、什么是WebRtc 1.1 概述 随着网络技术的快速发展&#xff0c;实时通讯变得越来越重要。WebRtc(web Real-Time Communication)技术应运而生。WebRtc是一个支持在浏览器进行实时语音&#xff0c;视频通信和数据传输的开放项目&#xff0c;它可以在不需要安装任何插件或者第三方…

MySQL:进阶巩固-存储过程

目录 一、存储过程的概述二、存储过程的基本使用2.1 创建存储过程2.2 使用存储过程2.3 查询指定数据库的存储过程以及状态信息2.4 查看某个存储过程的定义2.5 删除存储过程2.6 案例 三、存储过程的变量设置3.1 系统变量3.2 用户自定义变量3.3 局部变量 四、IF判断五、参数六、C…

【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析、数学模型及Python代码

2024年中国研究生数学建模竞赛 E题&#xff1a;高速公路应急车道紧急启用模型 问题分析 更新进展 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题&#xff1a;高速公路应急车道紧急启用…

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…

多校园信息付费发布顶置自定义表单小程序开源版开发

多校园信息付费发布顶置自定义表单小程序开源版开发 为校园管理和互动提供了强大的支持&#xff0c;包括用户端和运营后台两大部分。用户端允许学生和教职工方便地访问各种功能模块&#xff0c;而运营后台则使管理员能够高效地管理和配置系统。产品支持自定义模块和表单&#…

CUDA编程三、C++和cuda实现矩阵乘法SGEMM

目录 一、矩阵SGEMM 二、SGEMM的各种实现 1、cpu版本的实现 2、GPU并行计算最初始的版本 GPU中数据的移动 3、矩阵分块Shared Memory优化 4、LDS.128 float4* 优化 5、__syncthreads()位置优化 6、blank conflict优化 bank概念 bank conflict bank conflict危害和处…

c++ 继承 和 组合

目录 一. 继承 1.1 继承的概念 1.2 继承定义 1.3 继承类模板 1.4. 继承中的作用域 二. 派生类&#xff08;子类&#xff09;的默认成员函数 2.1 概念&#xff1a; 2.2 实现⼀个不能被继承的类 2.3 继承与友元 2.4继承与静态成员 三.多继承及其菱形继承问题 3.1继承方…