JWT學習文章:
前兩篇文章中我寫了jwt的原理,並且也用原理實現了jwt的驗證。如果要看前兩篇文章,點選上面的連線就能夠連結過去。
第二篇文章實現jwt原理時有同學就說每個成熟的框架中都有相應的jwt實現或整合。說的不錯,每個主流的框架中幾乎毫無例外的都整合了jwt的實現,但是我們上篇文章的重點是希望大家能夠明白原理,和這些框架中實現的基本思路,如無特殊情況也沒有必要自己來寫。
那麼這篇文章我們就來看看asp.net core中jwt如何使用!
注意,本文主要是程式碼,必要的文字說明我已經都在程式碼註釋中寫出來了。文末我會給出原始碼地址。
新建一個空的asp.net core專案:
新建一個類Const放置一些常量:
public class Const { public const string SecurityKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSfLGu+kcFDcJUCV46J+SbgR0lNc2NqgCGzojQTWW9xqjuzPF3mpisvTggYZSGfBzN+88YLZYbBLrDTUMJ4nTieElbP6SHkBFu8F+7fFBi7w3UPsaAXDr2E2srQYU5ZlKAcFBoNajNWj3sfSVRoYRPdqDTj4WdJlUPSNGz0wgRrQIDAQAB"; public const string Domain = "http://localhost:5000"; }
在Startup中嚮應用新增jwt驗證服務:
//新增jwt驗證: services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true,//是否驗證Issuer ValidateAudience = true,//是否驗證Audience ValidateLifetime = true,//是否驗證失效時間 ClockSkew = TimeSpan.FromSeconds(30), ValidateIssuerSigningKey = true,//是否驗證SecurityKey ValidAudience = Const.Domain,//Audience ValidIssuer = Const.Domain,//Issuer,這兩項和前面簽發jwt的設定一致 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey))//拿到SecurityKey }; });
管道中新增jwt驗證:
//新增jwt驗證 app.UseAuthentication();
由於管道有執行順序的特性,因此最好放在管道的開始位置。
新增登入獲取token的介面:
[ApiController] [Route("[controller]")] public class AuthController : ControllerBase { [AllowAnonymous]//指定此屬性應用於的類或方法不需要授權。 [HttpGet] public IActionResult Get(string userName, string pwd) { if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd)) { var claims = new[] { new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") , new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"), new Claim(ClaimTypes.Name, userName) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: Const.Domain, audience: Const.Domain, claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds); return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) }); } else { return BadRequest(new { message = "username or password is incorrect." }); } } }
方法中對使用者名稱和密碼的驗證只是簡單的驗空,實際應用中會更復雜,也會與資料庫中的資料比對。
接下來就是對jwt的應用了。
新建HomeController,用於驗證jwt是否成功啟用:
[ApiController] [Route("[controller]")] public class HomeController : ControllerBase { [HttpGet] [Route("api/value1")] public ActionResult<IEnumerable<string>> Get() { return new string[] { "value1", "value1" }; } [HttpGet] [Route("api/value2")] [Authorize] public ActionResult<IEnumerable<string>> Get2() { return new string[] { "value2", "value2" }; } }
其中Get()方法不需要驗證,Get2()需要驗證。
測試:
先測試Get()方法(介面名稱時api/value1),因為此方法不用驗證:
驗證成功!!!
接下來測試Get2():
訪問Get2()方法的介面名api/value2,貼上上面獲得的token到header中:
驗證成功!!!
總結:至此,使用asp.net core 自帶的jwt方法就完成了。
原始碼地址:https://gitee.com/jingboweilanGO/Demo_jwt_core.git
說明:Demo-jwt-core是本篇文章涉及到的原始碼,是使用asp.net core 自帶的jwt方法;
Demo-jwt-core2是上一篇文章的原始碼,根據jwt原理實現的程式碼。