.Net Core——JWT授權


關於JWT的基本概念,如果有不清晰的同學,請點擊這里,就不在這里贅述了。接下來聊聊JWT是怎么發揮作用的。

 

第一,安裝nuget包

Microsoft.AspNetCore.Authentication.JwtBearer

 

第二,配置【Startup】

首先是【ConfigureServices】方法,下面要寫一大堆進去

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(x => {
                    x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters() { ValidateLifetime = true,
                        LifetimeValidator = (notBefore, expires, securityToken, validationParameters) => { bool t = DateTime.UtcNow < expires; return t; }, 
                        ValidateAudience = false, ValidateIssuer = true, ValidIssuer = jwtConfig.Issuer, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.Key)), }; });

雖然看起來多,實際上邏輯很清晰,我在這里簡單解釋一下:

RequireHttpsMetadata:獲取或設置元數據地址或權限是否需要HTTPS,默認為true

SaveToken:是否將信息存儲在token中

TokenValidationParameters:這部分網上有很多版本,其中大部分都是寫滿的,但這對新手不太友好;而且也不是必須寫滿。先解釋一些代碼里的驗證開關(設置true、false的我稱為驗證開關)

ValidateLifetime——是否驗證過期時間

ValidateAudience——是否驗證被發布者

ValidateIssuer——是否驗證發布者

ValidateIssuerSigningKey——是否驗證簽名

查看框架代碼你會發現更多的驗證開關,這里就不一一解釋了:

 

然后在【Configure】添加引用:

app.UseAuthentication();
app.UseAuthorization();

這里的順序不能顛倒。第一行是開啟身份驗證,第二行是開啟授權。

 

第三,配置

JWT需要進行一些簡單的配置來確保安全,至於配置寫在哪里都可以,我是放在appsettings內:

  "JWT": { "Issuer": "發布者,一般是一個域名", "Key": "一個新的guid", "Expires": 600(秒) }

 

第四,生成JWT

為了方便大家理解,我這邊直接上代碼:

     public static string GetToken(IOptions<JwtConfig> _options, dynamic customer) { var claims = new[] { new Claim(ClaimTypes.Name,"JWT"), new Claim("ID",customer.ID), new Claim("WxOpenID",customer.WxOpenID), new Claim("Father",customer.Father) };          var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.Value.Key)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _options.Value.Issuer, claims: claims, expires: DateTime.UtcNow.AddMinutes(_options.Value.Expires), signingCredentials: credentials); return new JwtSecurityTokenHandler().WriteToken(token); }

如果在token中想要攜帶某些參數,可以使用Claim進行封裝。

接下來還有3個小步驟:

1、對配置文件中的key進行加密,得到對稱加密key。

2、使用上一步得到的結果生成數字證書。

3、配置token的內容。

最后,就可以生成jwt並且返回了。

 

第五,獲取JWT內容

正常情況下,JWT除了做驗證以外,還要有一些參數做輔助。上面說了參數傳遞是通過定義claim實現的,那么怎么合法的解析呢?還是直接上代碼:

     public static JwtInfo GetInfoFromToken(string token = null) { if (token is null) return null; string tokenStr = token.Replace("Bearer ", ""); var handler = new JwtSecurityTokenHandler(); var payload = handler.ReadJwtToken(tokenStr).Payload; var claims = payload.Claims; JwtInfo info = new JwtInfo() { ID = claims.First(claim => claim.Type == "ID")?.Value, WxOpenID = claims.First(claim => claim.Type == "WxOpenID")?.Value, Father = claims.First(claim => claim.Type == "Father")?.Value }; return info; }

這一段沒什么好講的,對應的名字拿到對應的參數。不過如果參數不存在這里會報錯,所以盡量規范一點,首尾呼應。

 

第六,代碼應用

JWT也生成了,同時也可以反向解析傳遞的參數了,該如何應用到代碼中去呢?這里要用到特性。

為需要進行驗證的控制器添加【Authorize】特性,這個控制器下的所有方法在外部調用時就都需要JWT認證才可順利調用,否則返回401(未授權)。如果不是全部方法都需要認證,那么可以為方法添加【AllowAnonymous】特性來忽略認證限制,如圖:

 

最后

基於JWT可以延伸出更多玩法,同學們有好的想法歡迎討論。

 


免責聲明!

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



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