在使用 JWT(JSON Web Token)時,issuer
是一個非常重要的屬性。它表示 JWT 的發行者,通常是用來識別誰生成和簽發了這個令牌。設定並驗證 issuer
可以增加 JWT 的安全性,防止令牌被偽造或來自不信任的發行者。
issuer
的作用
- 標識發行者:
issuer
表示令牌的生成者或發行者,通常是一個可信賴的服務或應用程序。 - 安全驗證:在驗證 JWT 時,可以檢查
issuer
是否匹配預期的值,以確保令牌是由受信任的發行者簽發的。 - 防止偽造:通過檢查
issuer
,可以防止不受信任的來源生成和使用假令牌。
設定 issuer
的數值
issuer
通常是一個字符串,可以是 URL 或者其他能夠唯一標識發行者的字符串。這個值應該在發行令牌和驗證令牌的時候保持一致。
設定 issuer
的步驟
發行令牌時設置
issuer
: 在生成 JWT 時,你需要在SecurityTokenDescriptor
中設置Issuer
屬性。csharpvar 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 });
驗證令牌時檢查
issuer
: 在配置 JWT 驗證時,你需要設置TokenValidationParameters
來檢查Issuer
。csharpbuilder.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; }
}
配置身份驗證和授權
csharpvar 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();
注意事項
Issuer
和Audience
應該設置為能夠唯一標識你應用的值,並且應該保持一致。yoursecretkey
應該是強隱私的隨機字串,並且應該安全存儲,不能公開暴露。- 這些設定應該在開發和生產環境中分別配置,避免敏感信息洩露。
這樣配置後,你的應用就能夠使用 JWT 進行身份驗證,並確保 JWT 是由受信任的發行者簽發的。