.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,就返回登錄頁面,就可以了。希望對大家有幫助。

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM