.net core8 使用JWT鉴权(附当前源码)

news/2024/9/19 12:51:18/文章来源:https://www.cnblogs.com/cyzf/p/18417965

说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。

    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。

    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。

结合上一篇文章使用,味道更佳:.net core8 使用Swagger(附当前源码)

有兴趣的朋友,请关注我吧(*^▽^*)。

第一步:安装最新Jwt包

    包名:Microsoft.AspNetCore.Authentication.JwtBearer

第二步:appsettings.json中配置jwt

 /*jwt鉴权*/"JwtSetting": {"Issuer": "微信公众号:不只是码农", //发行人"Audience": "微信公众号:不只是码农", //订阅人"ExpireSeconds": 120, //过期时间,默认分钟"ENAlgorithm": "HS256", //秘钥算法 "SecurityKey": "bzsmn=Start20240913EndOverallAuth-WebApi" //秘钥构成}

第三步:创建jwt解析模型

    在OverallAuth-WebApi项目的目录下创建文件夹【model】,并创建一个类文件JwtSettingModel.cs

    OverallAuth-WebApi结构,见上一篇文章:.net core8 使用Swagger(附当前源码)

 /// <summary>/// jwt配置模型/// </summary>public class JwtSettingModel{/// <summary>/// 密钥/// </summary>public string SecurityKey { get; set; }/// <summary>/// 加密算法/// </summary>public string ENAlgorithm { get; set; }/// <summary>/// 颁发者/// </summary>public string Issuer { get; set; }/// <summary>/// 接收者/// </summary>public string Audience { get; set; }/// <summary>/// 过期时间    单位:秒/// </summary>public int ExpireSeconds { get; set; }}

目录结构如下:

第四步:创建Jwt、AppSettings插件

目录结构如下:

上图可以看到,我们创建了JwtPlugInUnit和AppSettingsPlugInUnit2个插件,它分别对应jwt和AppSettings配件文件的解析。

那么我们看下,这2个类里面的具体内容。

JwtPlugInUnit如下:

/// <summary>
/// jwt插件
/// </summary>
public static class JwtPlugInUnit
{/// <summary>/// 初始化JWT/// </summary>/// <param name="services"></param>public static void InitJWT(this IServiceCollection services){var jwtsetting = AppSettingsPlugInUnit.GetNode<JwtSettingModel>("JwtSetting");services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o =>{o.TokenValidationParameters = new TokenValidationParameters(){ValidateIssuerSigningKey = true,ValidIssuer = jwtsetting.Issuer,ValidAudience = jwtsetting.Audience,IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtsetting.SecurityKey)),ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ClockSkew = TimeSpan.Zero};});}
}

AppSettingsPlugInUnit如下:

 /// <summary>/// AppSettings配置文件插件/// </summary>public class AppSettingsPlugInUnit{/// <summary>/// 声明配置属性/// </summary>public static IConfiguration Configuration { get; set; }/// <summary>/// 构造函数/// </summary>static AppSettingsPlugInUnit(){Configuration = new ConfigurationBuilder().Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true }).Build();}/// <summary>/// 获得配置文件的对象值/// </summary>/// <param name="jsonPath">文件路径</param>/// <param name="key"></param>/// <returns></returns>public static string GetJson(string jsonPath, string key){if (string.IsNullOrEmpty(jsonPath) || string.IsNullOrEmpty(key)) return null;IConfiguration config = new ConfigurationBuilder().AddJsonFile(jsonPath).Build();//json文件地址return config.GetSection(key).Value;//json某个对象
     }/// <summary>/// 获取数据库连接字符串/// </summary>/// <returns></returns>public static string GetMysqlConnection(){return Configuration.GetConnectionString("MySql").Trim();}/// <summary>/// 根据节点名称获取配置模型/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Node"></param>/// <returns></returns>public static T GetNode<T>(string Node) where T : new(){T model = Configuration.GetSection(Node).Get<T>();return model;}}

第五步:让jwt遵守Swagger协议

因为我们系统使用到了Swagger,所以要让jwt遵守Swagger协议,因此我们要在Swagger中添加如下代码。

/// <summary>
/// 初始化Swagger
/// </summary>
/// <param name="services"></param>
public static void InitSwagger(this IServiceCollection services)
{//添加swaggerservices.AddSwaggerGen(optinos =>{typeof(ModeuleGroupEnum).GetEnumNames().ToList().ForEach(version =>{optinos.SwaggerDoc(version, new OpenApiInfo(){Title = "权限管理系统",Version = "V2.0",Description = "求关注,求一键三连",Contact = new OpenApiContact { Name = "微信公众号作者:不只是码农   b站作者:我不是码农呢", Url = new Uri("http://www.baidu.com") }});});//反射获取接口及方法描述var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";optinos.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFileName), true);//使用jwtoptinos.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme{Description = "请在下方输入框子输入Bearer Token 开启JWT鉴权",Name = "Authorization", // 默认名称,不能修改In = ParameterLocation.Header,Type = SecuritySchemeType.ApiKey,Scheme = "Bearer"});//让swagger遵守jwt协议optinos.AddSecurityRequirement(new OpenApiSecurityRequirement{{new OpenApiSecurityScheme{Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = "Bearer"}},new List<string>()}});});
}

说明:InitSwagger方法是初始化Swagger的方法,在上一篇文章:.net core8 使用Swagger(附当前源码)  中有讲到。

 第六步:初始化Jwt

 在Program中添加一下代码,初始化Jwt

第七步:验证Jwt

做好以上步骤,jwt就可以正常使用。

当你看到图中标识时,就表示jwt初始化成功,就可以在系统中使用jwt鉴权等操作。

使用【[Authorize]】、【 [AllowAnonymous]】特性测试鉴权。

以下2个接口一个需要验证、一个不需要验证,我们来测试下。

[Authorize]开启验证测试

CheckJwt接口:开启验证,不传token

可以看到,开启jwt验证的,接口在没有传入token的情况下,访问失败。

UnCheckJwt接口:不开启验证。

以上就是.net core8 使用jwt系统鉴权的配置过程。

感谢你的耐心观看。

如果对你有帮助,请关注我微信公众号吧(*^▽^*)。

源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api  

帮我Star,谢谢。

有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

 

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

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

相关文章

鸿蒙跨端实践-布局方案介绍

作者:京东科技 刘宁 一、前言动态化使用 jue 语言(开发风格与 Vue 一致)开发,对于视图的布局采用了标准的Flex 布局方式。对于列表类视图,动态化提供了<scroll>、<slider>、<recycle-list>、<waterfall>等标签,将子视图的布局管理封装到标签中实现…

GBASEDBTSERVER 环境变量7GBASEDBTSHMBASE 环境变量 (UNIX™)

GBASEDBTSERVER 环境变量 GBASEDBTSERVER 环境变量指定 SQL API 客户机、DB-Access 实用程序或其他 GBase 8s 产品与之建立显式或隐式连接的缺省数据库服务器。 必须先设置此环境变量,才能使用 GBase 8s 客户机产品。它具有以下语法。 dbservername 是缺省数据库服务器的名称。…

【Java】若依(ruoyi)——7.代码生成(二)细节操作

之前我们已经学习了代码生成的基础使用:https://www.cnblogs.com/luyj00436/p/18398248。即创建数据库并根据三种数据结构生成代码。 1. 基本信息和生成信息前缀 可以在配置表设置默认配置。单应用在resources目录下的application.yml,多模块ruoyi-generator中的resources目录…

史无前例,移植V8虚拟机到纯血鸿蒙系统

作者:京东科技 于飞跃 一、背景如图所示,Roma框架是我们自主研发的动态化跨平台解决方案,已支持iOS,android,web三端。目前在京东金融APP已经有200+页面,200+乐高楼层使用,为保证基于Roma框架开发的业务可以零成本、无缝运行到鸿蒙系统,需要将Roma框架适配到鸿蒙系统。…

Apple AirPods 售后服务 All In One

Apple AirPods 售后服务 All In One Apple 支持Apple AirPods 售后服务 All In One AirPods 支持 https://support.apple.com/zh-cn/airpodsAirPods 使用手册 https://support.apple.com/zh-cn/guide/airpods/welcome/web 查找 AirPods 序列号 https://support.apple.com/zh-cn…

使用sourceinsight阅读内核代码的一些问题

工具栏格式乱了怎么办 https://blog.csdn.net/qq_23327993/article/details/115567723 Linux内核中有很多宏定义,sourceinsight不识别,导致解析出问题 https://blog.csdn.net/nust20/article/details/46486947 https://www.jianshu.com/p/0b4ad9532367 https://tjtech.me/how…

error: Extra characters after test expression

问题:error: Extra characters after test expression 原因:在qt的pro文件中缺少 "/"

three

1. 扫描2. 访问http服务,并测试功能点联系方式留有电话和邮箱,得知target的域名 3. 寻找其他子域名 gobuster下的vhost模块能够枚举虚拟主机,尝试用不同的hostname发现服务器IP上其他host 使用方法如下: gobuster vhost -w /usr/share/seclists/Discovery/DNS/subdomains-to…

js Stream API简单使用

ReadableStream <script>// TextDecoder将字节转换为字符串,默认 utf-8 编码let uint8Array = new Uint8Array([72, 101, 108, 108, 111]);console.log(new TextDecoder().decode(uint8Array)); // Hellolet uint8Array1 = new Uint8Array([228, 189, 160, 229, 165, 189…

SDK实现广播的流程

其中APP:application 指应用程序 SD:softdevice    指蓝牙协议栈 SCANNER: 指扫描设备您的资助是我最大的动力!金额随意,欢迎来赏!如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。如果,您希望更容易地发现我的新博客,不妨点击一下绿色通…

ZBlogPHP提示非法访问,验证码不显示,验证码报错

针对您在 ZBlogPHP 升级后遇到的问题,以下是解决步骤:定位文件位置使用 FTP 客户端或者通过您的虚拟主机控制面板中的文件管理器找到 zb_users 目录。 打开 c_option.php 文件。修改配置选项在 c_option.php 文件中找到如下两行配置:phpZC_LOGIN_CSRFCHECK_ENABLE => tru…

【Java】若依框架(RuoYi-master)——8.文件上传

若依框架的自带上传和下载功能,但需要我们进行恰当的操作(具体也可以参考示例和源码)。新建表格 新建一张学生信息表(这里的字段、文件路径、文件名称与改说明相关):DROP TABLE IF EXISTS `sys_student`; CREATE TABLE `sys_student` (`student_id` int NOT NULL AUTO_I…