Google Code Prettify

JWT 的 issuer 是何作用?要如何設定其數值呢?

 在使用 JWT(JSON Web Token)時,issuer 是一個非常重要的屬性。它表示 JWT 的發行者,通常是用來識別誰生成和簽發了這個令牌。設定並驗證 issuer 可以增加 JWT 的安全性,防止令牌被偽造或來自不信任的發行者。

issuer 的作用

  1. 標識發行者issuer 表示令牌的生成者或發行者,通常是一個可信賴的服務或應用程序。
  2. 安全驗證:在驗證 JWT 時,可以檢查 issuer 是否匹配預期的值,以確保令牌是由受信任的發行者簽發的。
  3. 防止偽造:通過檢查 issuer,可以防止不受信任的來源生成和使用假令牌。

設定 issuer 的數值

issuer 通常是一個字符串,可以是 URL 或者其他能夠唯一標識發行者的字符串。這個值應該在發行令牌和驗證令牌的時候保持一致。

設定 issuer 的步驟

  1. 發行令牌時設置 issuer: 在生成 JWT 時,你需要在 SecurityTokenDescriptor 中設置 Issuer 屬性。

    csharp
    var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes("yoursecretkey"); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.Username) }), Expires = DateTime.UtcNow.AddHours(1), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature), Issuer = "yourissuer", // 設置 issuer Audience = "youraudience" }; var token = tokenHandler.CreateToken(tokenDescriptor); var tokenString = tokenHandler.WriteToken(token); return Ok(new { Token = tokenString });
  2. 驗證令牌時檢查 issuer: 在配置 JWT 驗證時,你需要設置 TokenValidationParameters 來檢查 Issuer

    csharp
    builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "yourissuer", // 設置 issuer 檢查 ValidAudience = "youraudience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yoursecretkey")) }; });

示例代碼

以下是完整的設定 issuer 的示例代碼:

發行令牌的控制器

csharp
[Route("api/[controller]")] [ApiController] public class AuthController : ControllerBase { [HttpPost("login")] public IActionResult Login([FromBody] LoginModel model) { if (model.Username == "test" && model.Password == "password") { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes("yoursecretkey"); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.Username) }), Expires = DateTime.UtcNow.AddHours(1), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature), Issuer = "yourissuer", // 設置 issuer Audience = "youraudience" }; var token = tokenHandler.CreateToken(tokenDescriptor); var tokenString = tokenHandler.WriteToken(token); return Ok(new { Token = tokenString }); } return Unauthorized(); } } public class LoginModel { public string Username { get; set; } public string Password { get; set; } }

配置身份驗證和授權

csharp
var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "yourissuer", // 設置 issuer 檢查 ValidAudience = "youraudience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yoursecretkey")) }; }); builder.Services.AddAuthorization(); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();

注意事項

  • IssuerAudience 應該設置為能夠唯一標識你應用的值,並且應該保持一致。
  • yoursecretkey 應該是強隱私的隨機字串,並且應該安全存儲,不能公開暴露。
  • 這些設定應該在開發和生產環境中分別配置,避免敏感信息洩露。

這樣配置後,你的應用就能夠使用 JWT 進行身份驗證,並確保 JWT 是由受信任的發行者簽發的。