JWT簡介 是一種身份認證的開放標準(RFC 7519),可以在網路應用間傳輸信息作為Json對象。由三部分組成:頭部(Header)、載荷(payload)和簽名(Signature). 頭部(Header) 兩部分組成,令牌類型和所使用的的簽名演算法 { "alg":"HS256", "typ": ...
JWT簡介
是一種身份認證的開放標準(RFC 7519),可以在網路應用間傳輸信息作為Json對象。由三部分組成:頭部(Header)、載荷(payload)和簽名(Signature).
頭部(Header)
兩部分組成,令牌類型和所使用的的簽名演算法
{ "alg":"HS256", "typ":"JWT" }
載荷(payload)
包含要傳輸的信息,包括用戶的身份信息、許可權等。載荷可以自定義,但需要避免包含敏感信息。
{ "sub":"1234567890", "name":"zuozuo", "iat":17773219179 }
簽名(Signature)
用於驗證令牌的完整性和真實性,通常通過使用頭部和載荷中的數據以及一個密鑰進行加密生成
HMACSHA256( base64UrlEncode(header)+"."+ base64UrlEncode(payload), secret )
JWT的工作流程
- 用戶提供用戶名和密碼進行身份認證
- 伺服器驗證用戶和密碼的正確性
- 伺服器使用私鑰簽發JWT,並將其發送給客戶端
- 客戶端將JWT存儲到本地,例如在瀏覽器的localstorage中。
- 客戶端在後續的請求中使用JWT進行身份認證,將其放在請求的頭部或其他位置
- 伺服器接收到請求後,使用公鑰驗證JWT的合法性和完整性。
- 如果JWT通過驗證,伺服器可以根據載荷中的信息進行授權和許可權驗證。
- JWT的有點包括不需要在伺服器端存儲會話信息,可擴展性好、跨語言和跨平臺支持等。由於JWT是基於對稱或非對稱加密的,因此需要妥善保管密鑰,以防止令牌被篡改。
- Asp.Net Core中使用Microsoft.AspNetCore.Authentication.JwtBearer包
- 配置身份認證服務
- 在Startup.cs文件的ConfigureServices中添加代碼,以配置JWT身份認證服務
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "NetCoreDemo", ValidAudience = "Test", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("!Qq123456Test*")) }; });
app.UseAuthentication();
app.UseAuthorization();
- 控制器使用身份認證,需要進行身份認證的控制器或者操作方法上添加[Authorize]標簽
- 生成JWT
- 在用戶登錄成功後,可以使用System,IdentityModel.Tokens.Jwt包來生成JWT,
[HttpPost] public IActionResult Login(string username, string password) { if (username == "admin" && password == "admin") { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes("!Qq123456Test*dsadsadsadsadsa");//密鑰 var tokenDescriptor = new SecurityTokenDescriptor { Subject = new System.Security.Claims.ClaimsIdentity( new Claim[] { new Claim(ClaimTypes.Name, username) }), Expires = DateTime.UtcNow.AddHours(1), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); var tokenString = tokenHandler.WriteToken(token); return Ok(new { Token = tokenString }); }