Swagger添加JWT验证(ASP.NET)

文章目录

  • JWT
    • 1、解析
    • 2、配置JWT

JWT

1、解析

1)客户端向授权服务系统发起请求,申请获取“令牌”。

2)授权服务根据用户身份,生成一张专属“令牌”,并将该“令牌”以JWT规范返回给客户端

3)客户端将获取到的“令牌”放到http请求的headers中后,向主服务系统发起请求。主服务系统收到请求后会从headers中获取“令牌”,并从“令牌”中解析出该用户的身份权限,然后做出相应的处理(同意或拒绝返回资源)

2、配置JWT

1、添加NuGet包Microsoft.AspNetCore.Authentication.JwtBearer

2、在appsettings.json中添加JWT配置节点

   "JWT": {"SecKey": "Jamin1127!#@$%@%^^&*(~Czmjklneafguvioszb%yuv&*6WVDf5dw#5dfw6f5w6faW%FW^f5wa65f^AWf56", //密钥"Issuer": "Jamin",  //发行者"ExpireSeconds": 7200 //过期时间}

3、在Program类里进行服务注册

#region JWT服务
// 注册JWT服务
builder.Services.AddSingleton(new JwtHelper(builder.Configuration));builder.Services.AddAuthentication( JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{options.TokenValidationParameters = new TokenValidationParameters(){ValidateIssuer = true, //是否验证IssuerValidIssuer = builder.Configuration["Jwt:Issuer"], //发行人IssuerValidateAudience = false, //是否验证Audience      ValidateIssuerSigningKey = true, //是否验证SecurityKeyIssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecKey"])), //SecurityKeyValidateLifetime = true, //是否验证失效时间ClockSkew = TimeSpan.FromSeconds(30), //过期时间容错值,解决服务器端时间不同步问题(秒)RequireExpirationTime = true,};
}
);
#endregion
//swagger里添加JWT授权builder.Services.AddSwaggerGen(c=> {c.SwaggerDoc("v1", new OpenApiInfo { Title = "Web API", Version = "v1" });//开启注释var xmlFile = $"{Assembly.GetEntryAssembly().GetName().Name}.xml";var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);c.IncludeXmlComments(xmlPath, true);// 配置 JWT Bearer 授权c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme{Description = "JWT Authorization header using the Bearer scheme",Name = "Authorization",In = ParameterLocation.Header,Type = SecuritySchemeType.Http,Scheme = "bearer"});var securityScheme = new OpenApiSecurityScheme{Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }};var securityRequirement = new OpenApiSecurityRequirement { { securityScheme, new string[] { } } };c.AddSecurityRequirement(securityRequirement);
});
//启用验证中间件
app.UseAuthentication();
app.UseAuthorization();

4、创建JWT类进行Token配置

using Microsoft.IdentityModel.Tokens;
using System.Diagnostics;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;namespace Blog.core.Common.Auth
{/// <summary>/// 授权JWT类/// </summary>public class JwtHelper{private readonly IConfiguration _configuration;/// <summary>/// Token配置/// </summary>/// <param name="configuration"></param>public JwtHelper(IConfiguration configuration){_configuration = configuration;}/// <summary>/// 创建Token 这里面可以保存自己想要的信息/// </summary>/// <param name="username"></param>/// <param name="mobile"></param>/// <returns></returns>public string CreateToken(string username, string mobile){try{// 1. 定义需要使用到的Claimsvar claims = new[]{new Claim("username", username),new Claim("mobile", mobile),/* 可以保存自己想要信息,传参进来即可new Claim("sex", "sex"),new Claim("limit", "limit"),new Claim("head_url", "xxxxx")*/};// 2. 从 appsettings.json 中读取SecretKeyvar secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecKey"]));// 3. 选择加密算法var algorithm = SecurityAlgorithms.HmacSha256;// 4. 生成Credentialsvar signingCredentials = new SigningCredentials(secretKey, algorithm);// 5. 根据以上,生成tokenvar jwtSecurityToken = new JwtSecurityToken(_configuration["Jwt:Issuer"],    //Issuer_configuration["Jwt:ExpireSeconds"],  //ExpireSecondsclaims,                          //Claims,DateTime.Now,                    //notBeforeDateTime.Now.AddSeconds(30),     //expiressigningCredentials               //Credentials);// 6. 将token变为stringvar token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);return token;}catch (Exception){throw;}}/// <summary>/// 获取信息/// </summary>/// <param name="jwt"></param>/// <returns></returns>public static string ReaderToken(string jwt){var str = string.Empty;try{//获取Token的三种方式//第一种直接用JwtSecurityTokenHandler提供的read方法var jwtHander = new JwtSecurityTokenHandler();JwtSecurityToken jwtSecurityToken = jwtHander.ReadJwtToken(jwt);str = jwtSecurityToken.ToString();}catch (Exception ex){Debug.WriteLine(ex.Message);}return str;}/// <summary>/// 解密jwt/// </summary>/// <param name="jwt"></param>/// <returns></returns>public string JwtDecrypt(string jwt){StringBuilder sb = new StringBuilder();try{JwtSecurityTokenHandler tokenHandler = new();TokenValidationParameters valParam = new();var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecKey"]));valParam.IssuerSigningKey = securityKey;valParam.ValidateIssuer = false;valParam.ValidateAudience = false;//解密ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwt,valParam, out SecurityToken secToken);foreach (var claim in claimsPrincipal.Claims){sb.Append($"{claim.Type}={claim.Value}");}}catch (Exception ex){Debug.WriteLine(ex.Message);}return sb.ToString();}}}

5、创建用户实体,进行用户密码的接收

using System.ComponentModel.DataAnnotations;namespace Blog.core.Models
{public class UserInfo{/// <summary>/// 其中 [Required] 表示非空判断,其他自己研究百度/// </summary>[Required]public string UserName { get; set; }[Required]public string Password { get; set; }[Required]public string PhoneNumber { get; set; }}
}

6、创建控制器,进行JWT的APi调用

using Blog.core.Common.Auth;
using Blog.core.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;namespace Blog.core.Controllers
{[Route("[controller]/[action]")][ApiController]public class UserController : ControllerBase{private readonly JwtHelper _jwt;/// <summary>/// 初始化/// </summary>/// <param name="jwtHelper"></param>public UserController(JwtHelper jwtHelper){_jwt = jwtHelper;}/// <summary>/// 获取Token/// </summary>/// <returns></returns>[HttpPost]public IActionResult GetToken(UserInfo user){//参数验证等等....if (string.IsNullOrEmpty(user.UserName)){return Ok("参数异常!");}//这里可以连接mysql数据库做账号密码验证//这里可以做Redis缓存验证等等//这里获取Token,当然,这里也可以选择传结构体过去var token = _jwt.CreateToken(user.UserName, user.PhoneNumber);//解密后的Tokenvar PWToken = _jwt.JwtDecrypt( token);return Ok(token+"解密后:"+PWToken);}/// <summary>/// 获取自己的详细信息,其中 [Authorize] 就表示要带Token才行/// </summary>/// <returns></returns>[HttpPost][Authorize]public IActionResult GetSelfInfo(){//执行到这里,就表示已经验证授权通过了/** 这里返回个人信息有两种方式* 第一种:从Header中的Token信息反向解析出用户账号,再从数据库中查找返回* 第二种:从Header中的Token信息反向解析出用户账号信息直接返回,当然,在前面创建        Token时,要保存进使用到的Claims中。*/return Ok("授权通过了!");}}  
}

在这里插入图片描述

注:获取Token后在Swagger上输入token的value就可以进行接口的调用了
在这里插入图片描述

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

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

相关文章

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

天星金融(原小米金融)聚焦金融知识普及和反诈宣传,践行金融为民

在信息网络快速发展的背景下&#xff0c;移动互联网为大众的生活带来诸多便利。随之而来的新型诈骗手段也层出不穷&#xff0c;成为当前影响群众安全感、幸福感的“隐形杀手”。天星金融&#xff08;原小米金融&#xff09;一直以来严厉抵制诈骗犯罪行为&#xff0c;积极开展各…

php 快速入门(七)

一、操作数据库 1.1 操作MySQL的步骤 第一步&#xff1a;登录MySQL服务器 第二步&#xff1a;选择当前数据库 第三步&#xff1a;设置请求数据的字符集 第四步&#xff1a;执行SQL语句 1.2 连接MySQL 函数1&#xff1a;mysql_connect() 功能&#xff1a;连接&#xff08;登录…

软件概要设计说明书word原件(实际项目)

一、 引言 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 范围 &#xff08;三&#xff09; 文档约定 &#xff08;四&#xff09; 术语 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&a…

深入了解RabbitMQ:构建高效的消息队列系统(三)

本系列文章简介&#xff1a; 本系列文章将深入了解RabbitMQ的工作原理、特性和最佳实践。我们将介绍如何安装和配置RabbitMQ服务器&#xff0c;以及如何开发生产者和消费者应用程序。我们还将探讨如何处理消息的持久化、消息路由和消息过滤。除此之外&#xff0c;我们将研究如何…

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

ChatGPT 商业金矿(上)

原文&#xff1a;ChatGPT Business Goldmines 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第一章&#xff1a;为什么我写这本书 欢迎阅读《ChatGPT 多源收入&#xff1a;20 个利润丰厚的业务&#xff0c;任何人都可以在一周内使用 ChatGPT 开始》。我很高兴分享我…

<QT基础(5)>事件监听

事件监听 事件监听&#xff08;Event Handling&#xff09;是在程序中监视和响应发生的事件的一种机制。在Qt中&#xff0c;事件监听是一种常见的用于处理用户输入、系统事件以及其他类型事件的方法。通过事件监听&#xff0c;您可以在发生特定事件时捕获事件并执行相应的操作…

常用开源机器学习库

开源工具和机器学习库为数据科学家提供了强大的工具集&#xff0c;以便进行数据分析、模型训练和预测。以下是一些流行的开源机器学习库的简单介绍&#xff1a; Scikit-learn&#xff1a; Scikit-learn 是一个广泛使用的 Python 机器学习库&#xff0c;提供了大量的监督和非监督…

React + 项目(从基础到实战) -- 第一期

react是什么 任何领域,强大,高效的东西一定是简单的 react 是js,外加一点模板语言JSX(像HTML)下载最多,生态丰富 符合js语法 React 官方中文文档 (docschina.org) 核心价值 组件化 数据驱动视图 组件化 不是react原创,在React流行开拆分组件页面,通过组件拼接页面,实现组…

在Rocky Linux上安装Docker

在Rocky Linux上安装Docker&#xff0c;您可以按照以下步骤操作&#xff1a; 更新您的软件包索引&#xff1a; sudo dnf update 安装必要的软件包&#xff1a; sudo dnf config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo 安装Docker Eng…

【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)

问题描述&#xff1a; 需要使用当前时间、日期&#xff0c;可以使用 SQL 中的 CURDATE() 、NOW()、CURTIME()运算符 案例&#xff1a; INSERT INTO table_name(current_time, column_name2,...) VALUES (NOW(),, ...)规则(Date 相关函数)&#xff1a; 规则(Date数据类型)

Pytorch:torch.utils.data.DataLoader

torch.utils.data.DataLoader 是PyTorch提供的一个功能&#xff0c;用来包装数据集并提供批量获取数据&#xff08;batch loading&#xff09;、打乱数据顺序&#xff08;shuffling&#xff09;、多进程加载&#xff08;multiprocessing loading&#xff09;等功能。当进行深度…

全栈的自我修养 ———— 微信小程序实现上传并保存图片

上传文件 1、使用原生上传 uni.chooseImage({success: (chooseImageRes) > {const tempFilePaths chooseImageRes.tempFilePaths;uni.uploadFile({url: ......,filePath: tempFilePaths[0], // name是服务端的属性名name: file, // 可添加请求头:header: { "Content…

如何在极狐GitLab 自定义 Pages 域名、SSL/TLS 证书

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

核验用户提供的身份证号和姓名是否一致的实名认证接口、C#调用

为什么要进行实名认证&#xff1f;互联网时代&#xff0c;网民在网上进行遨游的过程中&#xff0c;我们无法辨别其身份的真伪&#xff0c;网民财产安全没有保障&#xff0c;因此当平台用户在进行注册时&#xff0c;都会要求提供身份证信息使用实名认证接口来判断身份信息的真实…

Spark GraphX 算法实例

文章目录 Spark GraphX 算法实例PageRank算法连通分支算法三角形计算算法 Spark GraphX 算法实例 GraphX 中自带一系列图算法来简化分析任务。这些算法存在于org.apache.spark.graphx.lib包中&#xff0c;可以被Graph通过GraphOps直接访问。本章节主要介绍GraphX中主要的三个算…

Linux中关于vim相关操作的练习题,实操训练,配有相应的答案提示

3月25日vim相关操作 题目1&#xff1a; 1&#xff09;将/etc/hosts网络配置文件复制到/tmp/mydir下&#xff1b; 2&#xff09;使用vim编辑器打开hosts文件&#xff0c;按i进入编辑模式&#xff0c;将本机IP地址和主机名(client1)映射。 3&#xff09;按下esc键回到命令模式…

uniapp输入框事件(防抖)

一、描述 在输入框输入内容或者说输入关键词的时候&#xff0c;往往都要进行做防抖处理。如果不做防抖&#xff0c;你输入什么&#xff0c;动态绑定的数据就会保持一致。这样不好吗&#xff0c;同步获取。有个业务场景&#xff0c;如果是搜索框&#xff0c;你每次一个字符&…

【Linux 驱动基础】Linux platform平台设备驱动

# 前置知识 总线驱动模型简介&#xff1a; 总线是处理器与一个或者多个设备之间的通道&#xff0c;在设备模型中&#xff0c;所有的设备都是通过总线相连&#xff0c;当然也包括虚拟的 platform 平台总线。 总线驱动模型中有三要素&#xff1a; 1. 总线 /*** struct bus_ty…