视频地址:【WebApi+Vue3从0到1搭建《权限管理系统》系列视频:搭建JWT系统鉴权-哔哩哔哩】 https://b23.tv/R6cOcDO

qq群:801913255

一、在appsettings.json中设置鉴权属性

 /*jwt鉴权*/
"JwtSetting": {
"Issuer": "zhangsan", //发行人
"Audience": "zhangsan", //订阅人
"ExpireSeconds": 120, //过期时间,默认分钟
"ENAlgorithm": "HS256", //秘钥算法
"SecurityKey": "Zmz=Start2024013OverallAuth.WebApi" //秘钥构成
},

二、新建模型

添加模型JwtSettingModel其中字段和appsettings.json中的字段一样,如下

/// <summary>
/// jwt 配置模型
/// </summary>
public class JwtSettingModel
{
/// <summary>
/// 发行人
/// </summary>
public string Issuer { get; set; } /// <summary>
/// 订阅人
/// </summary>
public string Audience { get; set; } /// <summary>
/// 过期时间,默认分钟
/// </summary>
public int ExpireSeconds { get; set; } /// <summary>
/// 秘钥算法
/// </summary>
public string ENAlgorithm { get; set; } /// <summary>
/// 秘钥构成
/// </summary>
public string SecurityKey { get; set; } }

三、新建解析appsettings.json节点的帮助类

 /// <summary>
/// 配置文件解析帮助类
/// </summary>
public class ConfigurationHelper
{
/// <summary>
/// 配置项
/// </summary>
public static IConfiguration configuration { get; set; } /// <summary>
/// 构造实例化
/// </summary>
static ConfigurationHelper()
{
configuration = new ConfigurationBuilder().Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true }).Build();
} /// <summary>
/// 获取appsetings 配置节点
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="node"></param>
/// <returns></returns>
public static T GetNode<T>(string node) where T : new()
{
T mode = configuration.GetSection(node).Get<T>();
return mode;
} }

四、在Startup.cs编写鉴权代码

找到ConfigureServices方法,在方法中添加如下代码

 //添加jwt鉴权
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, option =>
{
var jwtsetting = ConfigurationHelper.GetNode<JwtSettingModel>("JwtSetting");
Configuration.Bind("JwtSetting", jwtsetting);
option.SaveToken = true;
option.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = jwtsetting.Issuer,//发行人
ValidAudience = jwtsetting.Audience,//订阅人
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsetting.SecurityKey)),//解密的密钥
ValidateIssuerSigningKey = true,//是否验证签名,不验证的画可以篡改数据,不安全
ValidateIssuer = true,//是否验证发行人,就是验证载荷中的Iss是否对应ValidIssuer参数
ValidateAudience = true,//是否验证订阅人,就是验证载荷中的Aud是否对应ValidAudience参数
ValidateLifetime = true,//是否验证过期时间,过期了就拒绝访问
ClockSkew = TimeSpan.Zero,//这个是token缓冲过期时间,如果设置了,token过期时间就是缓冲时间+过期时间
//RequireExpirationTime = true,
}; });

并在Configure方法中添加jwt授权代码 app.UseAuthorization();

五、编写Jwt帮助类

/// <summary>
/// jwt帮助类
/// </summary>
public static class JwtHelper
{
/// <summary>
/// 生成token
/// </summary>
/// <param name="loginResult"></param>
/// <returns></returns>
public static string BuildToken(LoginModel loginResult)
{
LoginModel result = new();
var jwtsetting = ConfigurationHelper.GetNode<JwtSettingModel>("JwtSetting"); //获取登录信息
var calime = loginResult.PropValueType().Select(x => new Claim(x.Name, x.Value.ToString(), x.Type)).ToList(); //记录登录信息
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsetting.SecurityKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var header = new JwtHeader(creds);
var paylod = new JwtPayload(jwtsetting.Issuer, jwtsetting.Audience, calime, DateTime.Now, DateTime.Now.AddMinutes(jwtsetting.ExpireSeconds)); //正式创建令牌
var token = new JwtSecurityToken(header, paylod);
var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);
var ddd = token.ValidTo.AddHours(8).ToString();
return tokenStr;
} /// <summary>
/// 反射获取字段信息
/// </summary>
/// <param name="obj">模型</param>
/// <returns></returns>
public static IEnumerable<(string Name, object Value, string Type)> PropValueType(this object obj)
{
List<(string a, object b, string c)> result = new();
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;
}
}

然后再webapi接口控制器上方添加鉴权特性[Authorize],这样所有接口都会遵守jwt鉴权协议

六、Swagger接口文档使用Jwt鉴权

做好以上五点,webapi中就能正常使用jwt鉴权,但如果你使用Swagger测试接口,那么就要让Swagger遵守Jwt协议

所以必须在添加以下代码,注意这段代码是写在AddSwaggerGen中

 //把jwt添加到swagger中
optinos.AddSecurityDefinition("OverallAuth.WebApi", new OpenApiSecurityScheme
{
Description = "直接在下框中输入Bearer token(注意两者之间是一个空格)",
Name = "Authorization",//jwt默认的参数名称
In = ParameterLocation.Header,//jwt默认存放请求头中
Type = SecuritySchemeType.ApiKey
}); //swagger遵守jwt授权协议
optinos.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme{
Reference = new OpenApiReference {
Type = ReferenceType.SecurityScheme,
Id = "OverallAuth.WebApi"
}
},new string[] { }
}
});

以上就是在webapi中使用jwt的详细代码

使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权的更多相关文章

  1. Vue2.0 + ElementUI 手写权限管理系统后台模板(一)——简述

    挤一下: 一开始以为没有多少人用就没建群,但是加我的人太多了,好多问题都是重复的,所以建个群大家互相沟通交流方便点,但是建的有点晚,错过了好多人所以群里人有点少,QQ群: 157216616 小提示 ...

  2. express搭建权限管理系统

    express搭建权限管理系统 权限管理,是管理系统中的常见组件.通常需要定义资源,把资源调配给用户,通过判断用户是否有权限增删改查来实现. 初衷: 使用express开发过的项目大大小小加在一起也有 ...

  3. SpringCloud 2020.0.4 系列之 JWT用户鉴权

    1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...

  4. JavaEE权限管理系统的搭建(四)--------使用拦截器实现登录认证和apache shiro密码加密

    RBAC 基于角色的权限访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个 ...

  5. JavaEE权限管理系统的搭建(一)--------项目中用到的知识点概括

    转战Java有一段时间了,.net 已不再开发的新的工程,基本上在维护,最近大半年时间在学习Java,今天抽空将学习的到的知识,应用到了一个权限管理系统的小项目中,特此记录一下.代码如有不对之处,希望 ...

  6. Vue + Element UI 实现权限管理系统(搭建开发环境)

    技术基础 开发之前,请先熟悉下面的4个文档 vue.js2.0中文, 优秀的JS框架 vue-router, vue.js 配套路由 vuex,vue.js 应用状态管理库 Element,饿了么提供 ...

  7. JavaEE权限管理系统的搭建(三)--------springmvc和mabatis整合环境搭建

    本节介绍如何环境的搭建和配置: 首先要在父工程引入jar包依赖: <!-- 通过属性定义指定jar的版本 --> <properties> <spring.version ...

  8. JavaEE权限管理系统的搭建(八)--------角色的增删改

    如下图所示,添加角色的同时,要给角色分配权限菜单,关于权限数的显示,我实现了两种方式,普通方式和Ztree方式, 普通方式展示树: 主要代码部分: /** * 进入角色添加页面 * @param mo ...

  9. JavaEE权限管理系统的搭建(五)--------RBAC权限管理中的权限菜单的显示

    上一小节实现了登录的实现,本小节实现登录后根据用户名查询当前用户的角色所关联的所有权限,然后进行菜单的显示.登录成功后,如下图所示,管理设置是一级菜单,管理员列表,角色管理,权限管理是二级菜单. 先来 ...

  10. JavaEE权限管理系统的搭建(二)--------聚合工程项目的创建和依赖关系

    本项目是一个聚合工程,所以要先搭建一个聚合工程的框架 搭建完成的项目结构图如下: 首先创建父项目:pom类型 子模块:web层的搭建,war类型 把这个两个目录标记为对应的类型 其他子模块:和serv ...

随机推荐

  1. MDC实现微服务链路追踪

    一.问题背景 在微服务架构中,我们没办法快速定位用户在一次请求中对应的所有日志,在排查生产问题的时候会非常困难,那是因为我们在输出的日志的时候没把请求的唯一标示输出到我们的日志中,导致我们没办法根据一 ...

  2. centos7 开机自动执行脚本

    1.因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2.赋予脚本可执行权限假设/usr/loc ...

  3. git cherry-pick 摘樱桃 vscode

    git cherry-pick -n b2e9bf7530ce42910a5be99c358fa8c7ab6af507 -n 就是临时到暂存里面 SHA 可以为多个 逗号拼接

  4. 基于泰凌微TLSR8355的无线灯光智能控制系统解决方案调试总结

    前记  随着新技术的不断发展,在灯控市场.使用无线和传感器技术让灯的利用变得更加环保和智能是一个相对时尚的选择.最近跟几个客户做了一些此类的产品.发掘了一些有趣的功能和应用.这里做一个梳理. 特色梳理 ...

  5. Ambiq Micro-AMA3B2KK-KBR芯片可穿戴产品解决方案开发之RTC时钟

    一 RTC   RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片.绝大多数mcu芯片都集成了这个功能.在可穿戴产品中,时间往往是非常重要的因素,怎么让时间保持一直在运行,那就是 ...

  6. 2.4g无线私有协议透传方案特色梳理

    为什么?  在2.4G这个频段,的确有待你拥挤,有提供高速上网的wifi,有提供短距离数据和云音乐传输的bt,还要各种xx的东西.在wifi和bt无法覆盖的领域,又出来一个2.4G私有协议传输芯片,这 ...

  7. 鸿蒙HarmonyOS实战-ArkUI组件(Flex)

    一.Flex 1.概述 Flex布局它可以让容器中的子元素具有弹性伸缩性.Flex布局是一种二维布局模型,它可以在任意方向上对元素进行排列,并且可以动态地调整元素的大小和位置,以适应不同的屏幕尺寸和设 ...

  8. ImageSharp 一个全新的、功能齐全的、完全托管的、跨平台的 2D 图形库

    ImageSharp 是一个全新的.功能齐全的.完全托管的.跨平台的 2D 图形库.ImageSharp 旨在简化图像处理,为您带来了一个功能强大而又非常简单的 API. 可以实现很多功能,如:缩放, ...

  9. KingbaseES参数track_activity_query_size介绍

    背景 同事A在客户现场,最近注意到客户的主数据库性能有所下降,尤其是在高峰时段.怀疑可能有一些复杂的查询影响了数据库的性能,但尚未确定具体是哪些查询. 为了诊断问题,A决定查看高峰期正在执行的查询,先 ...

  10. Android组件(菜鸟教程)