1. 程式人生 > 其它 >JWT 驗證

JWT 驗證

JSON Web Token(JWT)是目前最流行的跨域身份驗證解決方案。為了網路應用環境間傳遞宣告而執行的一種基於JSON的開發標準(RFC 7519),

該token被設計為緊湊且安全的,特別適用於分散式站點的單點登陸(SSO)場景。JWT的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,

JWT的組成

下面是JWT的一段示例,分為三個部分,分別是頭部(header),載荷(payload)}和簽證(signature),他們之間用點隔開。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiLmtYHmnIjml6Dlj4wiLCJleHAiOjE1NzExMDIxNTMsInN1YiI6InRlc3RKV1QiLCJhdWQiOiJVU0VSIiwiaWF0IjoiMjAxOS8xMC8xNSA5OjE1OjQzIiwiZGF0YSI6eyJuYW1lIjoiMTExIiwiYWdlIjoxMSwiYWRkcmVzcyI6Imh1YmVpIn19.
25IbZpAbSXBQsr2k3h0IzKRAC6z3OJTWg38VDtcEER8


1.使用nuget安裝JWT(示例環境為 .net 4.5)



2.使用幫助類

     

public class JwtHelp { //私鑰 web.config中配置 //"GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; private static string secret = "footmark"; /// <summary> /// 生成JwtToken /// </summary> /// <param name="payload">不敏感的使用者資料</param> /// <returns></returns> public static string SetJwtEncode() { //格式如下 IDateTimeProvider provider = new UtcDateTimeProvider(); var now = provider.GetNow(); var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); //過期時間 var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds); var payload = new Dictionary<string, object> { { "exp", secondsSinceEpoch+3600 }, //3600秒後過期 { "username","admin" }, { "password","123456" } }; IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); IJsonSerializer serializer = new JsonNetSerializer(); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder); var token = encoder.Encode(payload, secret); return token; } /// <summary> /// 根據jwtToken 獲取實體 /// </summary> /// <param name="token">jwtToken</param> /// <returns></returns> public static string GetJwtDecode(string token) { try { IJsonSerializer serializer = new JsonNetSerializer(); IDateTimeProvider provider = new UtcDateTimeProvider(); IJwtValidator validator = new JwtValidator(serializer, provider); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); //token為之前生成的字串 var userInfo = decoder.DecodeToObject(token, secret, verify: true); //此處json為IDictionary<string, object> 型別 string username = userInfo["username"].ToString(); //可獲取當前使用者名稱 return "OK"; } catch (TokenExpiredException) { Console.WriteLine("Token has expired"); } catch (SignatureVerificationException) { Console.WriteLine("Token has invalid signature"); } catch (Exception) { } return "Error"; } }