使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权
视频地址:【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系统鉴权的更多相关文章
- Vue2.0 + ElementUI 手写权限管理系统后台模板(一)——简述
挤一下: 一开始以为没有多少人用就没建群,但是加我的人太多了,好多问题都是重复的,所以建个群大家互相沟通交流方便点,但是建的有点晚,错过了好多人所以群里人有点少,QQ群: 157216616 小提示 ...
- express搭建权限管理系统
express搭建权限管理系统 权限管理,是管理系统中的常见组件.通常需要定义资源,把资源调配给用户,通过判断用户是否有权限增删改查来实现. 初衷: 使用express开发过的项目大大小小加在一起也有 ...
- SpringCloud 2020.0.4 系列之 JWT用户鉴权
1. 概述 老话说的好:善待他人就是善待自己,虽然可能有所付出,但也能得到应有的收获. 言归正传,之前我们聊了 Gateway 组件,今天来聊一下如何使用 JWT 技术给用户授权,以及如果在 Gate ...
- JavaEE权限管理系统的搭建(四)--------使用拦截器实现登录认证和apache shiro密码加密
RBAC 基于角色的权限访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个 ...
- JavaEE权限管理系统的搭建(一)--------项目中用到的知识点概括
转战Java有一段时间了,.net 已不再开发的新的工程,基本上在维护,最近大半年时间在学习Java,今天抽空将学习的到的知识,应用到了一个权限管理系统的小项目中,特此记录一下.代码如有不对之处,希望 ...
- Vue + Element UI 实现权限管理系统(搭建开发环境)
技术基础 开发之前,请先熟悉下面的4个文档 vue.js2.0中文, 优秀的JS框架 vue-router, vue.js 配套路由 vuex,vue.js 应用状态管理库 Element,饿了么提供 ...
- JavaEE权限管理系统的搭建(三)--------springmvc和mabatis整合环境搭建
本节介绍如何环境的搭建和配置: 首先要在父工程引入jar包依赖: <!-- 通过属性定义指定jar的版本 --> <properties> <spring.version ...
- JavaEE权限管理系统的搭建(八)--------角色的增删改
如下图所示,添加角色的同时,要给角色分配权限菜单,关于权限数的显示,我实现了两种方式,普通方式和Ztree方式, 普通方式展示树: 主要代码部分: /** * 进入角色添加页面 * @param mo ...
- JavaEE权限管理系统的搭建(五)--------RBAC权限管理中的权限菜单的显示
上一小节实现了登录的实现,本小节实现登录后根据用户名查询当前用户的角色所关联的所有权限,然后进行菜单的显示.登录成功后,如下图所示,管理设置是一级菜单,管理员列表,角色管理,权限管理是二级菜单. 先来 ...
- JavaEE权限管理系统的搭建(二)--------聚合工程项目的创建和依赖关系
本项目是一个聚合工程,所以要先搭建一个聚合工程的框架 搭建完成的项目结构图如下: 首先创建父项目:pom类型 子模块:web层的搭建,war类型 把这个两个目录标记为对应的类型 其他子模块:和serv ...
随机推荐
- 接入移动手机号一键登录类的封装,app应用,php服务端类的封装与调用
需求:实现手机号一键登录,由于官方只有java的demo和jar包,没有php的sdk及demo <?php/* * 手机号一键登录加解密 */class Autophone{ const A_ ...
- hesitation 单词学习 犹豫 hes 就是 her 粘 助记单词 here
hesitation 单词学习 犹豫 hes 就是 her 粘 助记单词 here hes + itation(ite + ate + ion) hesitation 美: [ˌhezɪˈteɪʃ(ə ...
- SelectZenEmpty 下拉框 支持 最大长度 超出... vue 组件
<template> <Select v-model="innerValue" :disabled="disabled" :clearable ...
- shell脚本中将 IFS (Internal Field Separator 内部字段分隔符)替换为换行符
将 IFS 中的空白符(换行.制表符.空格)修改为仅包含换行 IFS 是shell中的内部变量,在使用 for var in var_list;do use $var do something don ...
- TornadoFx的EventBus使用
原文地址:TornadoFx中的EventBus使用 | Stars-One的杂货小窝 这里默认各位都清楚EventBus的具体作用,稍微有点短,主要国家没有啥好补充的吧 1.定义事件 //接收事件首 ...
- 【开源库推荐】#2 AndroidUtilCode Android常用工具类大全(附API使用说明)
Blankj/AndroidUtilCode: Android developers should collect the following utils(updating). Download Gr ...
- Ubuntu14.04 apache2 配置 CGI(并测试:shell,可执行文件,python)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Android 开发Day10
这是main里面的所有代码,按版本修改过 AndroidManifest.xml <?xml version="1.0" encoding="utf-8" ...
- window10-yarn-使用vite创建vue3项目失败-文件夹或目录不正确
前置条件 window10 本地已经安装nodejs yarn已经通过npm全局安装(npm install -g yarn) 问题 yarn脚手架方式搭建vue3项目失败(command faile ...
- IValueConverter的基础用法
1.我们在做工控项目的时候通常设置配方的上下限 这个时候要求OK数在上下限范围之内,否则NG 首先我们绑定一个简单的List用来展示数据,我这里用学生Age来展示 <ListView Items ...