.NET 6 WebApi Swagger 配置 JWT token+Authorize认证

Liu_某 2024-06-11 12:33:09 阅读 79

本篇文章简易介绍 .Net6 Weapi Jwt的认证过程,在此之前简易介绍一下jwt的常见问题

流程可以根据下方的流程图做解析

首先大家要打开VS2022创建SP.NET Core WebApi 的项目

然后下载可以配置Jwt的 的Nuget包

Microsoft.AspNetCore.Authentication.JwtBearer

我这里下载的是6.0版本的   下载时提示报错和自己的版本不搭配,大家看自己core的版本而定吧

6.0的net 就要用6.0的jwt

appsetting.json文件添加Jwt配置,瞎写就行,但是得满足有着三个字段,因为JWT配置的时候要用

"JWT": { "ISyouuser": "www.baidu.com.cn",//发行者 "IsAudience": "www.Audience.com.cn",//接收者 "SignKey": "000000000000000000"//秘钥 },

在Program.cs添加token验证,这里有需要用到的发行者、接受者、秘钥Key   是读取的json的字符串

鉴权用的按钮:Authorize ,如果没有这个步骤就没有办法鉴权的   这步也是关键

这两步都要加到var app = builder.Build();上面 不然会报错(因为builder.Build()之后是不让修改builder的)

using Microsoft.AspNetCore.Authentication.JwtBearer;using Microsoft.IdentityModel.Tokens;using Microsoft.OpenApi.Models;using System.Text;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();// 添加JWT token验证builder.Services.AddAuthentication(x =>{ x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(x =>{ x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(builder.Configuration.GetValue<string>("JWT:SignKey"))),//JWT秘钥 ValidIssuer = builder.Configuration.GetValue<string>("JWT:ISyouuser"),//发行者, ValidAudience = builder.Configuration.GetValue<string>("JWT:IsAudience"),//接收者, ValidateIssuer = true, ValidateAudience = true, // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比 ValidateLifetime = true, //注意这是缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间,如果不配置,默认是5分钟 ClockSkew = TimeSpan.Zero };});//添加Swagger的Authiozer的按钮鉴权builder.Services.AddSwaggerGen(s =>{ s.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() { Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, BearerFormat = "JWT", Scheme = "Bearer" }); s.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme{ Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer"} },new string[] { } } });});var app = builder.Build();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){ app.UseSwagger(); app.UseSwaggerUI();}app.UseHttpsRedirection();//app.UseAuthorization();app.UseAuthentication();// 认证中间件app.UseAuthorization();//授权中间件app.MapControllers();app.Run();

 然后  我们还要启用验证,还是在program.cs下,注意顺序,不能乱,一定要先认证、再授权 ,否则会验证失败

app.UseAuthentication();// 认证中间件app.UseAuthorization();//授权中间件

接下来我们新建一个Api控制器 

写一个token 方法用来做测试,注意!!!如果要读取appsetting.json文件的数据必须在控制器里注入IConfiguration

using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;using Microsoft.IdentityModel.Tokens;using System.IdentityModel.Tokens.Jwt;using System.Security.Claims;using System.Text;namespace test.Controllers{ [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private readonly IConfiguration _config; public ValuesController(IConfiguration configuration) { _config = configuration; } [HttpGet] [Route("/GetToken")] public ActionResult<string> GetToken() { //这里我写死了,后边可以写一个实体,输入用户名和密码放进这里 var claims = new[] { new Claim(ClaimTypes.Name,"userName"), new Claim(ClaimTypes.Upn,"userPwd") }; //发行者 var isyouruser = _config.GetValue<string>("JWT:ISyouuser"); //接受者 var isAudience = _config.GetValue<string>("JWT:IsAudience"); //秘钥key var scKey = _config.GetValue<string>("JWT:SignKey"); //设置token的过期时间 DateTime timeout = DateTime.Now.AddMinutes(30); var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(scKey)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var jwtToken = new JwtSecurityToken(isyouruser, isAudience, claims, expires: timeout, signingCredentials: credentials); var token = new JwtSecurityTokenHandler().WriteToken(jwtToken); return "Bearer " + token; } }}

然后在你需要授权的控制器加入属性[Authorize]

如下:

然后我们来测试一下

测试一下   再我没有获取token的情况下  执行 需要授权的控制器 方法

不出意外返回401,是因为要有token的全局认证

那我们继续执行 token接口 

复制token串,点击打开控制器右上角的Authorize

将串放入

然后依次点击 Authorize、Close

然后再去点击刚才的控制器

不出所料    授权成功,可以执行接口了

在这里稍稍提醒一下各位读者,在token接口里,我返回控制器方法token串是写的

"Bearer" + token

所以读者老爷如果只是单纯只返回token的时候,记得在控制器右上角的Authorize里  先写Bearer+空格+你的token

好了,今天的分享到这里,希望能够帮助到你,我们下期见  



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。