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:

  1. new Claim(JwtRegisteredClaimNames.Sub, username): Thêm thông tin người dùng vào JWT.
  2. new SymmetricSecurityKey(...): Tạo khóa bảo mật đối xứng từ chuỗi bí mật.
  3. 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ý.
  4. 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.


Các Hướng Dẫn Cùng Chủ Đề Đang Xem

Chuyển chuỗi markdown sang HTML bằng C#

Hướng dẫn cách chuyển đổi chuỗi markdown thành HTML trong C# bằng cách sử dụng thư viện MarkdownSharp.
Xử lý đa luồng trong C#

Hướng dẫn chi tiết về cách xử lý đa luồng trong C# giúp bạn tận dụng hiệu quả tài nguyên của CPU, đồng thời tăng hiệu suất của ứng dụng thông qua việc thực thi nhiều công việc đồng thời.
Cách chuyển đổi chữ cái Unicode có dấu thành không dấu trong C#

Hướng dẫn chi tiết cách chuyển đổi các ký tự Unicode có dấu tiếng Việt thành ký tự không dấu bằng C#.
Cách GET dữ liệu JSON từ API bằng C#

Hướng dẫn cách lấy dữ liệu JSON từ một API bằng C#, sử dụng lớp HttpClient và thư viện Newtonsoft.Json để xử lý dữ liệu.
Tạo mã Captcha bằng C#

Hướng dẫn cách tạo mã Captcha bằng C# để bảo vệ các form web và ứng dụng khỏi các truy cập tự động. Bài viết giúp bạn hiểu cách sử dụng thư viện `System.Drawing` để tạo hình ảnh Captcha.
Cách tự động đăng nhập vào website sử dụng Selenium với Chrome trong C#

Hướng dẫn cách sử dụng Selenium trong C# để tự động đăng nhập vào một trang web. Bài viết sẽ sử dụng trình duyệt Chrome và trình bày cách thực hiện từng bước để tự động hóa quy trình đăng nhập.
Tổng hợp tất cả các cách nối chuỗi trong C#

Hướng dẫn chi tiết về tất cả các cách nối chuỗi trong C#, bao gồm sử dụng toán tử nối chuỗi, phương thức nối chuỗi, và các cách tiếp cận hiệu quả khác.
Cách POST dữ liệu tới API bằng C#

Hướng dẫn cách gửi dữ liệu tới một API bằng phương thức POST trong C# sử dụng lớp HttpClient, giúp bạn dễ dàng thực hiện các yêu cầu với API.
Gửi đoạn mã JavaScript vào website bằng Selenium trong C#

Hướng dẫn cách sử dụng Selenium trong C# để gửi một đoạn mã JavaScript vào một website mở trong trình duyệt Chrome. Bài viết sẽ cung cấp mã mẫu và giải thích chi tiết từng bước.
Chức năng thường dùng khi sử dụng Selenium Chrome trong C#

Bài viết này sẽ liệt kê và mô tả các chức năng thường dùng khi sử dụng Selenium Chrome trong C#. Những chức năng này giúp bạn tự động hóa các tác vụ trên trình duyệt Chrome một cách hiệu quả.

Đã thêm vào giỏ hàng