C# JWT权限验证的实现
作者:幸福简单2020 发布时间:2022-11-24 00:57:13
标签:C#,JWT,权限验证
什么是JWT,它是一种对API的保护方案,为什么要进行保护呢
防泄漏:你肯定不希望你的数据能被别人随意调用,比如公司的机密信息,不可能每个人都可以访问到
防攻击:防止被人伪装恶意调用接口,利用网关就把请求拦截在外面,防止对服务器造成资源压力
防止被人篡改,导致请求不到信息,防重放攻击(案例:在公共网络环境中,请求被截获,稍后被重放或多次重放)
设计原则
轻量级
易于开发、测试和部署
适合于异构系统(跨操作系统、多语言简易实现)
所有写操作接口(增、删、改 操作)
非公开的读接口(如:涉密/敏感/隐私 等)
第一步:创建token
/// <summary>
/// 创建token
/// </summary>
/// <returns></returns>
[HttpPost]
public IActionResult CreateJWT1()
{
//创建声明Token数组
var claim = new Claim[]
{
new Claim("userid","123"),
new Claim("userCode","kevinMa"),
new Claim("projectID","62"),
new Claim("isValid","1"),
new Claim("userName","马鹏"),
new Claim("address","深圳"),
new Claim("datetime",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
new Claim("expires",DateTime.Now.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss")),
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yanglingcong@qq.com"));//密钥大小要超过128bt,最少要16位
//实例化一个token对象
//第一种方式
//var token = new JwtSecurityToken(claims: claim);
//第二种方式
var token = new JwtSecurityToken(
issuer: "kevin",//发起人:当前项目
audience: "kevin project",//订阅:我们需要谁去使用这个Token
claims: claim,//声明的数组
expires: DateTime.Now.AddHours(1),//当前时间加一小时,一小时后过期
signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)//数字签名 第一部分是密钥,第二部分是加密方式
);
//生成token
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
return ToSuccessJson(new { token = jwtToken });
}
第二步:解析token
/// <summary>
/// 解析token
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
[HttpPost]
public IActionResult JXToken(string token)
{
//第一种直接用JwtSecurityTokenHandler提供的read方法
var jwtHander = new JwtSecurityTokenHandler();
JwtSecurityToken jwtSecurityToken = jwtHander.ReadJwtToken(token);
GetTokenModel tokenModel = new GetTokenModel();
var currentInfo = jwtSecurityToken.Claims;
if (currentInfo.Count() > 0)
{
tokenModel.userid = currentInfo.FirstOrDefault(f => f.Type == "userid").Value;
tokenModel.userCode = currentInfo.FirstOrDefault(f => f.Type == "userCode").Value;
tokenModel.projectID = currentInfo.FirstOrDefault(f => f.Type == "projectID").Value;
tokenModel.userName = currentInfo.FirstOrDefault(f => f.Type == "userName").Value;
tokenModel.address = currentInfo.FirstOrDefault(f => f.Type == "address").Value;
tokenModel.datetime = currentInfo.FirstOrDefault(f => f.Type == "datetime").Value;
tokenModel.expires = currentInfo.FirstOrDefault(f => f.Type == "expires").Value;
}
return ToSuccessJson(new { tokenModel });
}
来源:https://blog.csdn.net/weixin_46942018/article/details/122302408


猜你喜欢
- 本文实例为大家分享了java验证码生成的具体代码,供大家参考,具体内容如下简单验证码java实现--servlet类生成 验证码img,并写
- Toast是一种简易的消息提示框,它无法获取焦点,按设置的时间来显示完以后会自动消失,一般用于帮助或提示。先给大家分享下我的解决思路:不用计
- 简介备忘录设计模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。
- java:使用匿名类直接new接口java中的匿名类有一个倍儿神奇的用法,见下面代码示例:package contract;public i
- What will be removed If you click Clear Data Button in the System Appl
- 在上一篇里已经向大家介绍了如何使用GDI+绘制简单的图像,这一片继续向大家介绍其它一些绘图知识.1.首先我们来看下上一片中我们使用过的Pen
- jQuery的方法连缀使用起来非常方便,可以简化语句,让代码变得清晰简洁。那C#的类方法能不能也实现类似的功能呢?基于这样的疑惑,研究了一下
- 专业的Android app开发人员会关注一些成熟的项目管理技术,以成功构建Android app,并让这个app在Google Play
- 引入所谓泛型,就是创建一个函数,对所有数据类型都生效。最常见的例子就是运算符,毕竟1+1=2,1.0+1.0=2.0,足以看出+是对多种数据
- 1 简介Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。两者在分布式、微服务架构中使用率极
- Lombok简介和其他语言相比,Java经常因为不必要的冗长被批评。Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,
- 简介Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术。生活中的方方面面都可以虚拟到代码中。代理模式所讲的就是现实生
- 一、RabbitMQ介绍RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发
- 前几天在这里分享了手写 sql 分页查询实现分页,现在来看看使用 mybatis 分页插件 pagehepler 来实现分页使用分页插件的原
- Servlet 实现文件上传所谓文件上传就是将本地的文件发送到服务器中保存。例如我们向百度网盘中上传本地的资源或者我们将写好的博客上传到服务
- 在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用。这里将会介绍如何通过设置允许局域网和外网机
- 前言基本语法首先我们要知道java的基础语法。1.由26个英文字母大小写,0-9,_或$组成2.数字不可以开头3.不可以使用关键字和保留字,
- 在日常工作中,我们可能常常需要打印各种文件资料,比如word文档。对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂
- 之前一段时间,在朋友的推荐下,玩了探探这一款软件,初玩的时候,就发现,这款软件与一般的社交软件如陌陌之类的大相径庭,让我耳目一新,特别是探探
- 本文实例讲述了C#对list列表进行随机排序的方法。分享给大家供大家参考。具体实现方法如下:public List<T> Ran