Xác thực JSON Web Token (JWT) trong C#
Hướng dẫn cách triển khai xác thực JSON Web Token (JWT) trong C#. Bài viết sẽ chỉ ra cách tạo, ký và xác thực JWT để bảo mật API và xác thực người dùng.
Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng JSON Web Token (JWT) trong C# để xác thực người dùng. JWT là một chuẩn mở giúp mã hóa thông tin người dùng một cách bảo mật, thường được sử dụng để bảo mật API. Chúng ta sẽ học cách tạo JWT, ký JWT với khóa bảo mật và xác thực tính hợp lệ của JWT khi nhận yêu cầu từ phía người dùng.
Mã C#:
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
class Program
{
// Tạo và ký JWT
public static string GenerateJwtToken(string username, string secretKey)
{
// Các thông tin (claims) đưa vào JWT
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
};
// Mã hóa khóa bảo mật
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
// Tạo token
var token = new JwtSecurityToken(
issuer: "yourapp.com",
audience: "yourapp.com",
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
// Xác thực JWT
public static ClaimsPrincipal ValidateJwtToken(string token, string secretKey)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes(secretKey);
// Các tham số để xác thực token
var validationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourapp.com",
ValidAudience = "yourapp.com",
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
try
{
var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);
return principal;
}
catch
{
return null; // Token không hợp lệ
}
}
static void Main()
{
string secretKey = "your-256-bit-secret"; // Khóa bảo mật bí mật
string token = GenerateJwtToken("user123", secretKey);
Console.WriteLine("JWT Token: " + token);
var claimsPrincipal = ValidateJwtToken(token, secretKey);
if (claimsPrincipal != null)
{
Console.WriteLine("Token hợp lệ. Người dùng: " + claimsPrincipal.Identity.Name);
}
else
{
Console.WriteLine("Token không hợp lệ");
}
}
}
Giải thích chi tiết từng dòng code:
-
new Claim(JwtRegisteredClaimNames.Sub, username)
: Thêm thông tin người dùng vào JWT. -
new SymmetricSecurityKey(...)
: Tạo khóa bảo mật đối xứng từ chuỗi bí mật. -
new JwtSecurityToken(...)
: Tạo một token mới với thông tin về người dùng, thời gian hết hạn, và khóa ký. -
tokenHandler.ValidateToken(...)
: Xác thực JWT dựa trên các tham số, kiểm tra khóa và thời gian hết hạn.
Yêu cầu hệ thống:
- .NET Core hoặc .NET Framework
- Thư viện
System.IdentityModel.Tokens.Jwt
Cách cài đặt các thư viện:
Chạy lệnh sau để cài đặt thư viện JWT trong C#:
dotnet add package System.IdentityModel.Tokens.Jwt
Lời khuyên:
- Nên lưu trữ khóa bảo mật một cách an toàn, không nên lưu trực tiếp trong mã nguồn.
- Sử dụng HTTPS để đảm bảo tính bảo mật khi gửi và nhận JWT qua mạng.