一、appsettings.Json文件配置
配置JWT公用参数。
1 /*JWT设置*/ 2 "JwtSetting": { 3 "Issuer": "http://www.xxxx.cn:8080/", //颁发者 4 "Audience": "http://www.xxxx.cn:8080/", //可以给哪些客户端使用 5 "SecretKey": "8B6E0B32BE822E4144315F05E7825150" //秘钥 6 },
二、JWTHelper自定义服务类
这部分代码主要是为了生存Token,以及解析加密的当前接口调用用户id
1 public class JWTService 2 { 3 #region 依赖注入 4 private readonly IConfiguration _configuration; 5 6 public JWTService(IConfiguration configuration) 7 { 8 _configuration = configuration; 9 } 10 #endregion 11 12 #region 方法 13 /// <summary> 14 /// 获取UserId 15 /// </summary> 16 /// <param name="UserId"></param> 17 /// <returns></returns> 18 public string GetToken(string UserId) 19 { 20 //相关Token的常量 21 var claims = new[] 22 { 23 new Claim(ClaimTypes.SerialNumber, UserId) 24 }; 25 26 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JwtSetting:SecretKey"])); 27 var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); 28 29 //JWT规定的部分字段 30 var token = new JwtSecurityToken( 31 issuer: _configuration["JwtSetting:Issuer"],//提供者 32 audience: _configuration["JwtSetting:Audience"],//被授权者 33 claims: claims, 34 expires: DateTime.Now.AddHours(24),//过期时间 35 signingCredentials: creds 36 ); 37 38 string Token = new JwtSecurityTokenHandler().WriteToken(token); 39 return Token; 40 } 41 42 /// <summary> 43 /// 获取当前登录用户ID 44 /// </summary> 45 /// <param name="User"></param> 46 /// <returns></returns> 47 public string GetCurrentUserId(ClaimsPrincipal User) 48 { 49 return User.Claims.SingleOrDefault(t => t.Type == ClaimTypes.SerialNumber).Value; 50 } 51 #endregion 52 }
三、Startup配置
1 #region JWT配置 2 services.AddAuthentication(options => { 3 //认证middleware配置 4 options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 5 options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 6 }) 7 .AddJwtBearer(options => { 8 //主要是jwt token参数设置 9 options.TokenValidationParameters = new TokenValidationParameters { 10 //颁发者 11 ValidateIssuer = true, 12 ValidIssuer = Configuration["JwtSetting:Issuer"], 13 //被授权者 14 ValidateAudience = true, 15 ValidAudience = Configuration["JwtSetting:Audience"], 16 //秘钥 17 ValidateIssuerSigningKey = true, 18 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSetting:SecretKey"])), 19 //是否验证失效时间【使用当前时间与Token的Claims中的NotBefore和Expires对比】 20 ValidateLifetime = true, 21 ClockSkew = TimeSpan.FromMinutes(5)//允许的服务器时间偏移量【5分钟】 22 }; 23 }); 24 #endregion;
1 //添加认证中间件【必须在授权前面添加】 2 app.UseAuthentication(); 3 //添加授权中间件 4 app.UseAuthorization();
1 #region 注册jwt中间件 2 services.AddTransient<JWTService>(); 3 #endregion
四、登录调用
4.1、依赖注入
4.2、返回给前端token
五、前端处理
前端拿到后,保存在全局参数中。
六、其他接口调用
这里一并给大家展示layui.js的两种类型请求。
6.1、table表单
6.2、普通ajax请求,注意跨域,后台接口也要设置跨域问题。
6.3、请求头展示
6.4、后台方法
6.5、之后拿到验证返回标志和查询请求接口用户id,这里的User是 ClaimsPrincipal里面的User,,这里的User.Identity.IsAuthenticated是bool类型的,成功是返回true,失败返回false,但是要想知道具体是权限不够还是请求时间超时,
我还没有办法分解处理,有办法的大佬可以评论或者私信我,万分感激。之后返回给前端,前端拿到返回的401,就返回登录页面,就可以了。希望对大家有帮助。