.NET、VUE利用RSA加密完成登录并且发放JWT令牌设置权限访问

news2024/9/24 17:11:21

后端生成公钥私钥

使用RSA.ToXmlString(Boolean) 方法生成公钥以及私钥。

RSACryptoServiceProvider rSA = new();
string pubKey = rSA.ToXmlString(false);//公钥
string priKey = rSA.ToXmlString(true);//私钥

后端将生成的公钥发送给前端 

创建一个get请求,将后端生成的公钥发送给前端,需要注意,这里生成的公钥是XML格式需要转换为pkcs8格式,前端JS只能处理pkcs8格式,私钥不能发给前端!!!!

这里需要安装一个包XC.RSAUtil用于转换格式。

Install-Package XC.RSAUtil -Version 1.3.6

[HttpGet]
public object Edd()
{
    var keyList = RsaKeyConvert.PublicKeyXmlToPem(pubKey);//将xml格式转换为Pkcs8
    return keyList;
}

前端使用公钥加密密码 

 使用的加密库为JSEncrypt库,安装JSEncrypt库。

npm install jsencrypt -D

页面引用 

import {JSEncrypt} from 'jsencrypt'

 界面

<div id="JWT">
	<div>
		账号:<input type="text" v-model="MyName"/>
	</div>
	<div>
		密码:<input type="text" v-model="MyPassword"/>
	</div>
	<button @click="Myinput">登录</button>
</div>

 保存账号密码以及后端发送过来的公钥。

data() {
	return {
		MyName: null,//账号
		MyPassword: null,//密码
		pubKey:null,//公钥
        JWTkey:null//JWT令牌
	}
}

 在使用登录界面时调用函数接收公钥并且保存。

created() {
	PostJwtEdd().then(res=>{
		this.pubKey=res
	}).catch(err => {
		console.log(err)
	})
}

 前端在输入账号密码后,对密码进行加密,将加密后的密码发送请求给后端,对比成功后前端将JWT令牌保存。

methods:{
	Myinput(){
		var encryptor = new JSEncrypt()
		encryptor.setPublicKey(this.pubKey)
		var rsaPassWord = encryptor.encrypt(this.MyPassword)//加密密码
		PostJwtDdd(this.MyName, rsaPassWord).then(res => {
			this.JWTkey=res//将后端生成的JWT令牌保存
		}).catch(err => {
			console.log(err)
		})
	}
}

发送密码的axio请求部分

export function PostJwtDdd(MyName,MyPassword){
	return request({
		method: 'post',
		url: '/JWTS/Ddd',
		data:{
			MyName,
			MyPassword
		}
	})
}

 这是发送的账号以及密码密文。

32d927f2022941459cf1df93cfaf9763.png

 后端接收参数对比

 后端接收得到参数,将密码密文进行解密。

创建一个类用于接收账号和加密后的密文。

public class RsaKey
{
   public string MyName { get; set; }
   public string MyPassword { get; set; }
}

 接收参数开始解密对比账号密码。

[HttpPost]
public object Ddd([FromBody] RsaKey rsaKey)
{
    rsa.FromXmlString(priKey);//传入私钥进行解密
    byte[] cipherbytex;
    cipherbytex = rsa.Decrypt(Convert.FromBase64String(rsaKey.MyPassword), false);
    var c = Encoding.UTF8.GetString(cipherbytex);//转换为string类型
    MyDbContext md = new MyDbContext();//对数据库表创建实体类
    var user = md.MyIntroductions.Where(x => x.MyName == rsaKey.MyName).Select(x => x.MyPassword);//数据库中寻找该账号对应的密码
    string users = null;
    foreach (var v in user)
    {
        users = v;
    }
    if (user == null)
    {
        return new { err = "账号错误" };
    }
    else
    {
        if (users == c)
        {
            //登录成功
        }
        else
        {
            return new { err = "密码错误" };
        }
    }
}

 生成JWT令牌

登录成功之后开始生成JWT令牌并且返回给前端,在登录成功哪里生成。

需要安装两个包。

包1:System.IdentityModel.Tokens.Jwt

Install-Package System.IdentityModel.Tokens.Jwt

包2:Microsoft.AspNetCore.Authentication.JwtBearer

Install-Package Microsoft.AspNetCore.Authentication.JwtBearer

List<Claim> claims = new List<Claim>();
claims.Add(new Claim("MyName", rsaKey.MyName));
claims.Add(new Claim(ClaimTypes.Role, rsaKey.MyName));//颁发管理员角色
string key = jwtSettingsOpt.Value.SecKey;
DateTime expire = DateTime.Now.AddSeconds(jwtSettingsOpt.Value.ExpireSeconds);
byte[] secBytes = Encoding.UTF8.GetBytes(key);
var seckey = new SymmetricSecurityKey(secBytes);
var credentials = new SigningCredentials(seckey, SecurityAlgorithms.HmacSha256Signature);
var tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expire, signingCredentials: credentials);
string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
return jwt;

这是前端接收到的JWT令牌

c607913874a0466f9c2926d03d6cefa1.png

 后端权限访问

 后端创建一个post请求,该请求带有[Authorize]

[Authorize]是一个用于处理权限的,在这里的作用就是对没有JWT令牌的请求返回401错误,也就是我们可以利用这一点来对登录的用户开放一些权限,如果没有JWT令牌那么就无法请求到数据。

该post请求会返回请求人的账号。

[Authorize]
[HttpPost]
public object Bdd()
{
    return this.User.FindFirst("MyName")!.Value;
}

 前端带JWT令牌进行访问

需要注意的是JWT令牌是通过'Authorization'的一个请求头发送过去,格式必须为:

Authorization:Bearer+一个空格+后端生成的JWT令牌

前端界面

<button @click="MyJwt">查看权限</button>
MyJwt(){
	var JwtKey='Bearer '+this.JWTkey
	console.log(JwtKey)
	PostJwtBdd(JwtKey).then(res=>{
		console.log(res)
	}).catch(err=>{
		console.log(err)
	})
}

axios请求部分

export function PostJwtBdd(JwtKey){
	return request({
		method: 'post',
		url: '/JWTS/Cdd',
		headers: {
			'Authorization': JwtKey
		}
	})
}

在后端请求中配置了[Authorize(Roles ="admin")]后,只有在Roles指定的用户才能对其接口进行访问,一般可以用于对管理员的访问,在生成JWT令牌的时候,

通过claims.Add(new Claim(ClaimTypes.Role, '用户'));来进行匹配,管理员用户。

 该post请求只有用户为admin的才能请求

[Authorize(Roles ="admin")]//配置只有管理员角色才能请求
[HttpPost]
public object Cdd()
{
      return this.User.FindFirst("MyName")!.Value;
}

 前端界面

<button @click="OneJwt">管理员权限</button>
OneJwt(){
	var JwtKey='Bearer '+this.JWTkey
	console.log(JwtKey)
	PostJwtCdd(JwtKey).then(res=>{
	console.log(res)
	}).catch(err=>{
	console.log(err)
	})
}

axios请求部分,同样请求也只能通过'Authorization': 请求头进行发送。

Authorization+"空格"+生成的JWT令牌

export function PostJwtCdd(JwtKey){
	return request({
		method: 'post',
		url: '/JWTS/Cdd',
		headers: {
			'Authorization': JwtKey
		}
	})
}

如果带有的是错误的JWT令牌,那么后端会返回401错误,如图所示:

f781a71d731a47c58f9fd4bd7e4e36ac.png

并且不会返回任何的对象。

2b36c695fc414624b4cb1487b33596bb.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于网络安全运营工作与安全建设工作的一些思考

以下内容是个人成长过程中对于网络安全运营工作的理解和思考&#xff0c;希望通过这篇文章帮助大家更好的去做安全运营体系化建设&#xff0c;开始吧&#xff01; 文章目录 一、网络安全运营是什么&#xff1f;二、网络安全运营建设阶段第一阶段&#xff1a;设备限制阶段第二阶…

思维导图软件 ConceptDraw MINDMAP mac中文特色介绍

ConceptDraw MINDMAP mac是一款思维导图绘制软件&#xff0c;它可以帮助用户快速创建各种类型的思维导图&#xff0c;如组织结构图、流程图、概念图和UML图等。该软件具有直观的界面和简单易用的操作方式&#xff0c;使得用户能够轻松地创建复杂的思维导图。此外&#xff0c;它…

【Java集合类面试二十六】、介绍一下ArrayList的数据结构?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;介绍一下ArrayList的数据…

C++ list 模拟实现

目录 1. 基本结构的实现 2. list() 3. void push_back(const T& val) 4. 非 const 迭代器 4.1 基本结构 4.2 构造函数 4.3 T& operator*() 4.4 __list_iterator& operator() 4.5 bool operator!(const __list_iterator& it) 4.6 T* operator->…

douyin ios 六神参数学习记录

玩那么久安卓了&#xff0c;也终于换一换ios终端分析分析&#xff0c;还是熟悉的x-gorgon&#xff0c;x-argus&#xff0c;x-medusa那些参数。 随便抓个抖音 ios版本的接口&#xff1a; 像评论接口&#xff1a; https://api26-normal-hl.amemv.com/aweme/v2/comment/list/?…

Unsatisfied dependency expressed through bean property ‘sqlSessionTemplate‘;

代码没有问题&#xff0c;但是启动运行报错 2023-10-25 16:59:38.165 INFO 228964 --- [ main] c.h.h.HailiaowenanApplication : Starting HailiaowenanApplication on ganluhua with PID 228964 (D:\ganluhua\code\java\hailiao-java\target\classes …

mysql 基础知识

MySQL 是一种关系型数据库&#xff0c;在Java企业级开发中非常常用&#xff0c;因为 MySQL 是开源免费的&#xff0c;并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL&#xff0c;因此它的稳定性是有保障的。MySQL是开放源代码的&#xff0c;因此任何人都可以在 GPL(Gener…

HarmonyOS鸿蒙原生应用开发设计- 华为分享图标

HarmonyOS设计文档中&#xff0c;为大家提供了独特的华为分享图标&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的华为分享图标内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的内容产生的侵权意外情况等&…

大型应用的架构演进--spring家族在其中的作用

01 大型应用的架构演进 带来的挑战&#xff1a; 运维与监控 分布式带来的复杂性 接口的调整成本 测试成本 依赖管理成本 02 Spring家族 在我看来&#xff0c;springboot的3大特点(我常用的)&#xff1a;内置的web容器&#xff1b;开箱即用的starter模版&#xff1b;自动配置&…

什么是光学字符识别 (Optical Character Recognition)?

人工智能如何推动光学字符识别OCR的发展 人工智能正在不断改变着光学字符识别&#xff08;Optical Character Recognition&#xff09;工具的功能。作为计算机视觉的一个分支领域&#xff0c;OCR主要用于处理文本图像&#xff0c;将图像中的文本转换为机器可读的形式。换言之&…

JS小数运算精度丢失的问题

工作中会不会经常会碰到一些数据指标的计算&#xff0c;比如百分比转化&#xff0c;保留几位小数等&#xff0c;就会出现计算不准确&#xff0c;数据精度丢失的情况。通过这篇分享借助第三方库能够轻松解决数据精度丢失的问题。 一、场景复现 JS数字精度丢失的一些常见问题 /…

Leetcode 18 三数之和

//双指针&#xff0c;不过因为是三个数所以左侧是两个下标class Solution {public List<List<Integer>> threeSum(int[] nums) {int n nums.length;Arrays.sort(nums);List<List<Integer>> ans new ArrayList<List<Integer>>();for(int …

如何制作二维码会议签到系统?

展会电子签到系统是一种通过电子方式进行参会者签到的系统。展会电子签到系统包括多种签到方式&#xff0c;如二维码签到、人脸识别、胸卡等。其中二维码签到制作简单、使用方便&#xff0c;是一种大家比较常用的方式。 二维码系统签到的优势主要有以下几点&#xff1a; 1、省…

《Spring Boot源码解读与原理分析》带你走入框架的世界

Java被称为最热门的语言。 而Spring Boot为我们提供了一种优雅而高效的方式来创建Spring基于的应用程序。它利用了许多Spring项目和第三方库,通过自动配置简化了项目配置。 此书籍不仅带来了许多题例&#xff0c;而且文章简而易懂&#xff0c;适合小白阅读&#xff0c;而且每…

响应式设计与自适应设计有何不同

目录 前言 响应式设计 用法 理解 自适应设计 用法 理解 高质量的设计 响应式设计与自适应设计是两种不同的网页设计方法&#xff0c;它们都旨在提供更好的用户体验&#xff0c;确保网站能够在不同设备和屏幕尺寸上正确显示。虽然这两种设计方法有共同之处&#xff0c;但…

测试员突破瓶颈指南,不看又废了一年

有没有感觉忙忙碌碌&#xff0c;一年又一年&#xff0c;却发现自己在测试的道路上好像没啥长进 测试群、测开群、自动化群&#xff0c;没少加&#xff1b; 文章、公众号、网盘的资源没少关注和搜集&#xff1b; 大佬推荐的书没少买&#xff0c;书上落灰了都没碰过&#xff1…

linux性能分析(七)CPU性能篇(二)怎么理解平均负载

一 怎么理解平均负载 ① 如何查看平均复杂 查看系统负载的命令&#xff1a; top、uptime、w、cat /proc/loadavg、tload /proc/loadavg 思考&#xff1a; uptime每列输出的含义?重点&#xff1a; 当前时间、系统运行时间、正在登录用户数、平均负载 ② 思考&#xff1…

利用 Databend + COS助力 CDH 分析 | 某医药集团

作者&#xff1a; 黄志武 某医药集团信息中心数据库组组长&#xff0c;13 年数据库行业从业经历&#xff0c;Oracle OCM&#xff0c;关注 Oracle、MySQL、Redis、MongoDB、Oceanbase、Tidb、Polardb-X、TDSQL、CDH、Clickhouse、Doris、Databend 等多方面的关键领域技术&#…

JavaScript对象与原型

目录 对象的创建 原型与原型链 原型继承 总结 在JavaScript中&#xff0c;对象是非常重要的概念之一。它们允许我们以一种结构化的方式存储和组织数据&#xff0c;并提供了一种方便的方式来操作和访问这些数据。而对象的行为和属性则通过原型来定义。 对象的创建 在JavaS…

如何集成验证码短信API到你的应用程序

引言 当你需要为你的应用程序增加安全性和用户验证功能时&#xff0c;集成验证码短信API是一个明智的选择。验证码短信API可以帮助你轻松实现用户验证、密码重置和账户恢复等功能&#xff0c;提高用户体验并增强应用程序的安全性。本文将介绍如何将验证码短信API集成到你的应用…