.NET 6 WebApi Swagger 配置 JWT token+Authorize认证
后台-插件-广告管理-内容页头部广告(手机) |
本篇文章简易介绍 .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/swashbuckle
- builder.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
好了,今天的分享到这里,希望能够帮助到你,我们下期见
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |