Google Code Prettify

顯示具有 Issuer 標籤的文章。 顯示所有文章
顯示具有 Issuer 標籤的文章。 顯示所有文章

JWT 的 Issuer 什麼作用?

JWT (JSON Web Token) 的 issuer (簡稱為 iss) 是 JWT 標頭和有效載荷中的一部分,用於指
示 JWT 的發行者。這是一個可選的聲明,但在很多情況下它被用來幫助驗證和識別令牌的來源。以
下是 issuer 的主要作用和設置方式:


主要作用
標識發行者:iss 聲明用來標識誰發行了這個令牌。這可以是發行令牌的認證伺服器的 URL 或名稱。
驗證令牌來源:在驗證令牌時,服務可以檢查令牌的 iss 聲明,以確保令牌是從可信任的發行者那裡
來的,從而防止來自未知或不受信任的來源的攻擊。

實現多租戶支持:在多租戶系統中,不同租戶可以有不同的發行者。通過檢查 iss,系統可以識別和
分離不同租戶的令牌。

設置 issuer
在生成 JWT 時,你需要設置 issuer。例如,如果你使用 System.IdentityModel.Tokens.Jwt 
庫來生成 JWT,設定 issuer 的方式如下:


csharp

var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, "user_id"),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    }),
    Expires = DateTime.UtcNow.AddHours(1),
    Issuer = "your_issuer", // 設定發行者
    Audience = "your_audience",
    SigningCredentials = credentials
};

var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
var jwtToken = tokenHandler.WriteToken(token);

Console.WriteLine(jwtToken);

驗證 issuer
在驗證 JWT 時,你也需要檢查 issuer。這可以通過設定 TokenValidationParameters 來實現:

csharp

var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
    ValidateIssuer = true, // 啟用發行者驗證
    ValidIssuer = "your_issuer", // 預期的發行者
    ValidateAudience = true,
    ValidAudience = "your_audience",
    ValidateLifetime = true,
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};

try
{
    var principal = tokenHandler.ValidateToken(jwtToken, validationParameters, out SecurityToken validatedToken);
    // Token 驗證成功,principal 包含了用戶的身份信息
}
catch (SecurityTokenException ex)
{
    // Token 驗證失敗
    Console.WriteLine(ex.Message);
}


總結
JWT 中的 issuer (iss) 聲明用來標識令牌的發行者,並在令牌驗證過程中幫助確認令牌的來
源是否合法和可信。設置和驗證 issuer 是確保 JWT 安全性的重要步驟,特別是在多租戶環境
和需要高安全性的應用中。

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 是由受信任的發行者簽發的。