视频地址:【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. 使用 Docker 部署 Next Terminal 轻量级堡垒机

    1)Next Terminal 介绍 官网:https://next-terminal.typesafe.cn/ GitHub:https://github.com/dushixiang/next-t ...

  2. [学习笔记]Rocket.Chat业务数据备份

    Rocket.Chat 的业务数据主要存储于mongodb数据库的rocketchat库中,聊天中通过发送文件功能产生的文件储存于/app/uploads中(文件方式设置为"FileSyst ...

  3. electron-vite 可用,本机软件开发环境搭建

    electron-vite 可用,本机软件开发环境搭建 https://electron-vite.github.io/

  4. vscode 格式化空格,constructor 构造函数的空格 会有问题,找到一个配置文件好使

    Ctrl+Shift+P "javascript.format.enable": false, "javascript.format.insertSpaceAfterCo ...

  5. String类为什么要用final修饰?

    final修饰符的意义? https://www.cnblogs.com/loren-Yang/p/13380318.html String类被实现的目标是什么? 效率和安全 如何实现期望? 参考文献 ...

  6. Linux 运维工程师面试真题-2-Linux 命令及文件操作

    Linux 运维工程师面试真题-2-Linux 命令及文件操作 1.在/tmp/目录下创建 test.txt 文件,内容为: Hello,World! ,用一个命令写出来. 2.给 test.txt ...

  7. jQuery(常用API)

    jQuery简介 1.基本使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  8. Three.js实现可透视的水面效果

    1. 引言 Three.js是著名的JavaScript 3D图形库,用于浏览器中开发 3D 交互场景的 JS 引擎,可以快速的搭建三维场景 Three.js官网为:创建一个场景 – three.js ...

  9. 记录-使用双token实现无感刷新,前后端详细代码

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 近期写的一个项目使用双token实现无感刷新.最后做了一些总结,本文详细介绍了实现流程,前后端详细代码.前端使用了Vue3+Vite ...

  10. .NET Emit 入门教程:第三部分:构建模块(Module)

    前言: 在这一部分中,我们将深入讨论动态程序集中模块的概念以及如何构建和管理模块. 1.模块的概念: 模块是动态程序集中的基本单位,它类似于一个独立的代码单元,可以包含类型.方法.字段等成员. 在动态 ...