首页 > 其他分享 >.NET Core6.0配置JWT

.NET Core6.0配置JWT

时间:2023-08-16 14:47:42浏览次数:40  
标签:apiResult JWT token var Token Core6.0 new NET builder

环境 ASP .NET Core Web API

JWT的一些讲解和与Session的区别俺就不多说了可以去官方文档了解一下

直接上代码简单粗暴(以下操作都是在ASP .NET Core Web API进行操作

第一步:引入一个NuGet包

 

 根据自己.NET版本选择对应的版本号

 

第二步:在appsettings.json配置一些信息

"Authentication": {
    "SecretKey": "你的密钥,长度必面在16位以上,不能泄漏给其它人比如一堆英文字母", 
    "Issuer": "随便输入比如一堆英文字母", //发行人 
    "Audience": "随便输入比如一堆英文字母" //发给谁 受众
  },

第三步:创建一个TokenHelper类

 1 public class TokenHelper
 2     {
 3         private readonly IConfiguration _configuration;
 4         private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler;
 5         public TokenHelper(IConfiguration configuration, JwtSecurityTokenHandler jwtSecurityTokenHandler)
 6         {
 7             _configuration = configuration;
 8             _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
 9         }
10         /// <summary>
11         /// 创建加密JwtToken
12         /// </summary>
13         /// <param name="user"></param>
14         /// <returns></returns>
15         public string CreateJwtToken<T>(T user)
16         {
17             var signingAlogorithm = SecurityAlgorithms.HmacSha256;
18             var claimList = this.CreateClaimList(user);
19             //Signature
20             //取出私钥并以utf8编码字节输出
21             var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
22             //使用非对称算法对私钥进行加密
23             var signingKey = new SymmetricSecurityKey(secretByte);
24             //使用HmacSha256来验证加密后的私钥生成数字签名
25             var signingCredentials = new SigningCredentials(signingKey, signingAlogorithm);
26             //生成Token
27             var Token = new JwtSecurityToken(
28           issuer: _configuration["Authentication:Issuer"], //发布者
29             audience: _configuration["Authentication:Audience"], //接收者
30             claims: claimList, //存放的用户信息
31             notBefore: DateTime.Now, //发布时间
32             expires: System.DateTime.Now.AddMinutes(3), //有效期设置为3分钟
33             signingCredentials //数字签名
34             );
35             //生成字符串token
36             var TokenStr = new JwtSecurityTokenHandler().WriteToken(Token);
37             return TokenStr;
38         }
39 
40       
41         /// <summary>
42         /// 创建包含用户信息的CalimList
43         /// </summary>
44         /// <param name="authUser"></param>
45         /// <returns></returns>
46         private List<Claim> CreateClaimList<T>(T authUser)
47         {
48             //获取当前类型
49             var Class = typeof(T);
50             //存储的载荷信息
51             List<Claim> claimList = new List<Claim>();
52             //GetProperties 获取当前对象的所有属性
53             foreach (var item in Class.GetProperties())
54             {
55                 //忽略
56                 if (item.Name == "UPass")
57                 {
58                     continue;
59                 }
60                 claimList.Add(new Claim(item.Name, Convert.ToString(item.GetValue(authUser))));
61             }
62             //claimList.Add(new Claim("Id", Convert.ToString(authUser)));
63             return claimList;
64         }
65     }

第15行使用泛型集合来接受一个对象参数

第32行设置了一个Token过期时间(注意这个时间可能有些误差比如设置过期时间为1分钟,那么实际过期时间大概在他的3倍左右)

其他东西粘贴即可

第四步:在Program.cs进行配置

 1 var builder = WebApplication.CreateBuilder(args);
 2 
 3 // Add services to the container.
 4 
 5 builder.Services.AddControllers();
 6 // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
 7 builder.Services.AddEndpointsApiExplorer();
 8 builder.Services.AddSwaggerGen(x => {
 9     #region 开启Swagger认证
10     x.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
11     {
12 
13         Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
14         Name = "Authorization",
15         In = ParameterLocation.Header,
16         Type = SecuritySchemeType.ApiKey,
17         BearerFormat = "JWT",
18         Scheme = "Bearer"
19     });
20 
21     x.AddSecurityRequirement(new OpenApiSecurityRequirement
22                 {
23                     {
24                         new OpenApiSecurityScheme
25                         {
26                             Reference = new OpenApiReference {
27                                 Type = ReferenceType.SecurityScheme,
28                                 Id = "Bearer"
29                             }
30                         },
31                         new string[] { }
32                     }
33                 });
34     #endregion
35 });
36 
37 //JWT认证
38 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
39 {
40 
41     //取出私钥
42     var secretByte = Encoding.UTF8.GetBytes(builder.Configuration["Authentication:SecretKey"]);
43     options.TokenValidationParameters = new TokenValidationParameters()
44     {
45         //验证发布者
46         ValidateIssuer = true,
47         ValidIssuer = builder.Configuration["Authentication:Issuer"],
48         //验证接收者
49         ValidateAudience = true,
50         ValidAudience = builder.Configuration["Authentication:Audience"],
51         //验证是否过期
52         ValidateLifetime = true,
53         //验证私钥
54         IssuerSigningKey = new SymmetricSecurityKey(secretByte)
55     };
56 });

第9至34行是在Swagger中加一个填写Token的按钮其中13至19是按钮里面显示的信息如下

 点击按钮后出现以下界面

 接下来在中间件中配置

 到这里已经完成了百分之九十

最后一步:创建一个控制器使用依赖注入将我们的TokenHelper注入进来

 编写一个登录的方法

 1         [HttpPost]
 2         [AllowAnonymous]
 3         public IActionResult GetLogin(LoginDto m)
 4         {
 5             ApiResult apiResult = new ApiResult();
 6             var obj = UserService.GetLogin(m);
 7 
 8             if(obj!=null)
 9             {
10                 apiResult.data = obj;
11                 apiResult.message = "登录成功!";
12                 apiResult.code = "200";
13                 var token = TokenHelper.CreateJwtToken(m);
14                 HttpContext.Response.Headers["token"] = token;
15                 Response.Headers["Access-Control-Expose-Headers"] = "token";
16                 return Ok(apiResult);
17             }
18             apiResult.data = null;
19             apiResult.code = "500";
20             apiResult.message = "登录有误!";
21             return Ok(apiResult);
22         } 
[AllowAnonymous]必须加上,它的主要作用就是无需身份验证进行操作
然后这里的第13到15行就是重中之重一定不要忘记写
第13行我们将我们查询到的用户信息当作参数调用我们TokenHelper中的方法创建一个JWT Token
第14行将生成的 JWT Token 存储在 HTTP 响应的头部中,使用键名 "token"。  这样,客户端在收到响应后可以从响头中获取该 Token。如下

 第15行设置了一个名为 "Access-Control-Expose-Headers" 的响应头,其值为 "token"。这是为了指定客户端在跨域请求时,可以访问到响应头中的 “token” 值。默认情况下,许多浏览器会限制客户端对某些响应头的访问,例如包含敏感信息。通过设置 "Access-Control-Expose-Headers" 头部,允许客户端访问指定的响应头部信息。

到这里已经大功告成了,已经可以在swagger中进行测试了,流程就是在没有登录的情况下,调用接口状态码都是401

解决方法就是先登录拿到Token解锁,这样就可以调用其他的方法了!!!

 

标签:apiResult,JWT,token,var,Token,Core6.0,new,NET,builder
From: https://www.cnblogs.com/dsjia/p/17633776.html

相关文章

  • C# .NET6 WPF 依赖注入
    入口文件:App.xaml.csusingMicrosoft.EntityFrameworkCore;usingMicrosoft.Extensions.Configuration;usingMicrosoft.Extensions.DependencyInjection;usingSerilog;usingSystem;usingSystem.IO;usingSystem.Text;usingSystem.Windows;namespaceDemo{......
  • 浅谈自己理解的JWT
    1、什么是JWTJWT是由三部分组成,包括头部(Header)、有效载荷(ayload)、签名(Signature)1.1头部是配置信息一般由两部分组成(I.令牌的类型,II.使用的签名算法)1.2有效载荷部分首先包含一些非敏感的数据,其次要包含过期时间(设置有效期)1.3签名部分,是对前两部分......
  • .Net Core DateTime.Now 在Linux下的格式问题
    .Net6使用DateTime获取系统当前时间,在Windows下输出为正常时间,但是在Linux下会获取到2023-8-16上午10:00:00类似的时间样式,会导致在Linux下抛出非法时间异常。解决方案:在Main函数中使用CultureInfo.DefaultThreadCurrentCulture属性来获取或设置当前应用程序域中线程的默认......
  • Windows 操作系统命令行 netsh winsock reset 的作用详解
    这个命令是一个用于Windows操作系统中的网络故障排除工具,它用于重置Winsock相关的配置,以解决与网络连接和通信相关的问题。命令解释:netsh:这是Windows中的一个命令行工具,用于管理网络、接口和配置。winsock:这是WindowsSockets的缩写,是一种应用程序编程接口(API),用于......
  • Windows 操作系统命令行 netsh int ip reset 的作用详解
    netshintipreset命令是用于重置Windows操作系统中的网络设置和配置的命令。它是netsh命令行工具的一部分,用于管理网络设置。这个命令在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。让我们来详细解释这个命令及其使用场景。命令详解:netsh......
  • Kubernets之有状态服务与无状态服务
    有状态服务有状态服务是指其它的实例具有一定区别的服务,比如mysql数据库,多个mysql实例的数据并不是完全一致的,因此不能随意对其进行扩容或收缩在Kubernets中,StatefulSet就是一种有状态部署的方式有状态服务适用于需要数据持久化的场景,例如MySQL数据库、Kafka和ZooKeeper。......
  • Kubernetes Deployment控制器创建pod k8s
    Deployment因为RCRS无法支持动态更新Deployment支持动态更新无状态应用管理Deployment控制器下面就是ReplicaSet当我们创建Deployment的时候实际上会给我们创建一个同名的ReplicaSet控制器,这个RS上面是我们对应的pod节点更新的时候,Deployment是支持自动更新的,RS也可以更新,就是......
  • 基于ASP.NET小微企业人力资源管理系统
    现如今,现代信息技术高速发展,人们的生活和工作方式都发生了巨大转变。现在越来越多的流行网上小微企业人力资源管理,网上小微企业人力资源管理使工作更方便快捷。人力资源管理领域也同样与我们生活息息相关,发生了重大的转变。越来越多的希望自己无论在什么时间、什么地点都可以自主小......
  • .NET相关知识点分享一
    第一章.NETCore入门1.NET为什么要跨平台?A.安全考虑(Linux开源)B.成本原因(Windows收费)C.软件生态(服务器软件生态优先在Linux)2.NETFramework和.NETCore的区别?跨平台支持:.NETFramework:最初是为Windows平台设计的,因此只能在Windows操作系统上运行。.NETCore:专注于......
  • NetSuite: Get specific Custom Record Types and related sub Custom Fields
    背景以前当使用search.create({})来获取数据时,我们需要制定特定的数据返回列;例如:search.createColumn(options)而query可以使用SELECT*FROM来动态返回所有的数据列(这在有的时候是一个优点),那么如何让search也动态返回所有的数据列呢?vararrColFlds=query.runSuiteQL({......