最近準備把一些外部認證接口認證改成jwt的,在 jwt.io的網站上找了下,.net的庫中排名第一的是微軟自家的庫System.IdentityModel.Tokens.Jwt,然而官方文檔對如何使用它卻語焉不詳,今天試了一下如何用這個微軟官方的JWT庫。簡單的寫個文章總結下
這個庫的核心對象是JwtSecurityTokenHandler,可以通過它實現JWT的生成,讀取,校驗等核心操作,下面就以幾個簡單的示例演示下:
生成Token
生成token需要使用JwtSecurityTokenHandler.CreateToken函數,這裏使用的key函數比較簡單,直接讀的ASCII碼,傳入的時候需要保持和密碼算法要求位數一致,實際使用時可以進行響應的修改。
public string GenerateToken(string id, string secret) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(secret); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim("id", id) }), Expires = DateTime.UtcNow.AddDays(7), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); }
讀取Token
讀取token需要使用JwtSecurityTokenHandler.ReadToken函數,基本示例如下,由於讀取的是明文部分,故是不需要傳輸密碼的。
public void ReadToken(string token) { var tokenHandler = new JwtSecurityTokenHandler(); var readedToken = tokenHandler.ReadToken(token); var jwtToken = (JwtSecurityToken)readedToken; //讀取id var userId = jwtToken.Claims.First(x => x.Type == "id").Value; }
校驗Token
讀取token需要使用JwtSecurityTokenHandler. ValidateToken函數,可以傳入多個校驗參數,時間,密碼等,時間也支持容差,算是功能比較全了。
public void ValidateToken(string token, string secret) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(secret); tokenHandler.ValidateToken(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false, }, out SecurityToken validatedToken); var jwtToken = (JwtSecurityToken)validatedToken; //讀取id var userId = jwtToken.Claims.First(x => x.Type == "id").Value; }
參考文章:
.NET 5.0 - Create and Validate JWT Tokens + Use Custom JWT Middleware