您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-04-01
后台-插件-广告管理-内容页头部广告(手机)

本篇文章简易介绍 .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配置的时候要用

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

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

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

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

  1. using Microsoft.AspNetCore.Authentication.JwtBearer;
  2. using Microsoft.IdentityModel.Tokens;
  3. using Microsoft.OpenApi.Models;
  4. using System.Text;
  5. var builder = WebApplication.CreateBuilder(args);
  6. // Add services to the container.
  7. builder.Services.AddControllers();
  8. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  9. builder.Services.AddEndpointsApiExplorer();
  10. builder.Services.AddSwaggerGen();
  11. // 添加JWT token验证
  12. builder.Services.AddAuthentication(x =>
  13. {
  14. x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  15. x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  16. }).AddJwtBearer(x =>
  17. {
  18. x.RequireHttpsMetadata = false;
  19. x.SaveToken = true;
  20. x.TokenValidationParameters = new TokenValidationParameters
  21. {
  22. ValidateIssuerSigningKey = true,
  23. IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(builder.Configuration.GetValue<string>("JWT:SignKey"))),//JWT秘钥
  24. ValidIssuer = builder.Configuration.GetValue<string>("JWT:ISyouuser"),//发行者,
  25. ValidAudience = builder.Configuration.GetValue<string>("JWT:IsAudience"),//接收者,
  26. ValidateIssuer = true,
  27. ValidateAudience = true,
  28. // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
  29. ValidateLifetime = true,
  30. //注意这是缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间,如果不配置,默认是5分钟
  31. ClockSkew = TimeSpan.Zero
  32. };
  33. });
  34. //添加Swagger的Authiozer的按钮鉴权
  35. builder.Services.AddSwaggerGen(s =>
  36. {
  37. s.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
  38. s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
  39. {
  40. Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
  41. Name = "Authorization",
  42. In = ParameterLocation.Header,
  43. Type = SecuritySchemeType.ApiKey,
  44. BearerFormat = "JWT",
  45. Scheme = "Bearer"
  46. });
  47. s.AddSecurityRequirement(new OpenApiSecurityRequirement
  48. {
  49. {
  50. new OpenApiSecurityScheme{
  51. Reference = new OpenApiReference {
  52. Type = ReferenceType.SecurityScheme,
  53. Id = "Bearer"}
  54. },new string[] { }
  55. }
  56. });
  57. });
  58. var app = builder.Build();
  59. // Configure the HTTP request pipeline.
  60. if (app.Environment.IsDevelopment())
  61. {
  62. app.UseSwagger();
  63. app.UseSwaggerUI();
  64. }
  65. app.UseHttpsRedirection();
  66. //app.UseAuthorization();
  67. app.UseAuthentication();// 认证中间件
  68. app.UseAuthorization();//授权中间件
  69. app.MapControllers();
  70. app.Run();

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

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

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

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

  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.IdentityModel.Tokens;
  5. using System.IdentityModel.Tokens.Jwt;
  6. using System.Security.Claims;
  7. using System.Text;
  8. namespace test.Controllers
  9. {
  10. [Route("api/[controller]")]
  11. [ApiController]
  12. public class ValuesController : ControllerBase
  13. {
  14. private readonly IConfiguration _config;
  15. public ValuesController(IConfiguration configuration)
  16. {
  17. _config = configuration;
  18. }
  19. [HttpGet]
  20. [Route("/GetToken")]
  21. public ActionResult<string> GetToken()
  22. {
  23. //这里我写死了,后边可以写一个实体,输入用户名和密码放进这里
  24. var claims = new[]
  25. {
  26. new Claim(ClaimTypes.Name,"userName"),
  27. new Claim(ClaimTypes.Upn,"userPwd")
  28. };
  29. //发行者
  30. var isyouruser = _config.GetValue<string>("JWT:ISyouuser");
  31. //接受者
  32. var isAudience = _config.GetValue<string>("JWT:IsAudience");
  33. //秘钥key
  34. var scKey = _config.GetValue<string>("JWT:SignKey");
  35. //设置token的过期时间
  36. DateTime timeout = DateTime.Now.AddMinutes(30);
  37. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(scKey));
  38. var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  39. var jwtToken = new JwtSecurityToken(isyouruser, isAudience, claims, expires: timeout, signingCredentials: credentials);
  40. var token = new JwtSecurityTokenHandler().WriteToken(jwtToken);
  41. return "Bearer " + token;
  42. }
  43. }
  44. }

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

如下:

然后我们来测试一下

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

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

那我们继续执行 token接口 

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

将串放入

然后依次点击 Authorize、Close

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

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

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

"Bearer" + token

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

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

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索