當前位置: 妍妍網 > 碼農

C#整合JWT快速入門

2024-04-21碼農

一、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。