一、JWT基本概念
JSON Web Token(JWT)是一種開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用於在雙方之間安全地傳輸資訊作為JSON物件。這些資訊可以被驗證、信任,因為它們是數位簽名的。JWT常用於身份驗證和授權場景,特別是在微服務架構和分布式系統中。
JWT主要由三部份組成:Header(頭部)、Payload(負載)和Signature(簽名)。
二、JWT的生成
在C#中,我們可以使用
System.IdentityModel.Tokens.Jwt
名稱空間下的類來生成JWT。以下是一個簡單的範例:
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
publicstringGenerateJWT(string userId, string secretKey)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(secretKey);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, userId)
// 可以添加更多聲明,如角色、許可權等
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
在上述程式碼中,我們首先建立了一個
JwtSecurityTokenHandler
例項。然後,我們定義了一個
SecurityTokenDescriptor
,它包含了JWT的主題(即使用者資訊)、過期時間以及簽名憑據。最後,我們使用
tokenHandler
生成並返回JWT。
三、JWT的驗證
驗證JWT主要是檢查其簽名是否有效,以及是否過期。這可以透過
JwtSecurityTokenHandler
類的
ValidateToken
方法實作:
publicboolValidateJWT(string token, string secretKey, out ClaimsPrincipal principal)
{
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)),
ValidateIssuer = false,
ValidateAudience = false
};
SecurityToken validatedToken;
try
{
principal = tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
returntrue;
}
catch (Exception)
{
principal = null;
returnfalse;
}
}
在上述程式碼中,我們首先建立了一個
JwtSecurityTokenHandler
例項和一個
TokenValidationParameters
例項。
TokenValidationParameters
包含了驗證JWT所需的所有參數,如簽名金鑰等。然後,我們嘗試使用
tokenHandler.ValidateToken
方法驗證JWT。如果JWT有效,該方法將返回一個
ClaimsPrincipal
例項,該例項包含了JWT中的所有聲明;否則,將丟擲異常。
四、JWT的授權
在驗證了JWT之後,我們可以從
ClaimsPrincipal
例項中獲取使用者的角色或許可權,並根據這些資訊進行授權。這通常是在伺服端進行的,可以透過檢查特定的聲明(如
role
或
permission
)來實作。例如:
if (principal.HasClaim(c => c.Type == ClaimTypes.Role && c.Value == "admin"))
{
// 使用者是管理員,允許存取受保護的資源
}
else
{
// 使用者不是管理員,拒絕存取受保護的資源
}
在上述程式碼中,我們首先檢查
ClaimsPrincipal
例項是否包含一個型別為
role
且值為
admin
的聲明。如果是,那麽我們就認為使用者是管理員,並允許其存取受保護的資源;否則,我們將拒絕其存取。
總結
:JWT提供了一種安全、靈活的方式來傳輸使用者資訊,並可以用於身份驗證和授權。在C#中,我們可以使用
System.IdentityModel.Tokens.Jwt
名稱空間下的類來生成、驗證和使用JWT。