.NET CORE WebAPI JWT身份验证

一、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   },
appsettings参数配置

 二、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     }
JWT帮助类

三、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;
ConfigureServices配置
1 //添加认证中间件【必须在授权前面添加】
2 app.UseAuthentication();
3 //添加授权中间件
4 app.UseAuthorization();
Configure配置
1 #region 注册jwt中间件
2 services.AddTransient<JWTService>();
3 #endregion
ConfigureServices中间件注册

四、登录调用

      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,就返回登录页面,就可以了。希望对大家有帮助。

        

原文地址:https://www.cnblogs.com/xiaobaicai12138/p/13255295.html