JWT (JSON Web Token) là một tiêu chuẩn mở (RFC 7519) cho phép truyền tải thông tin một cách an toàn giữa các bên dưới dạng một đối tượng JSON. Trong ASP.NET Core Web API, JWT được sử dụng phổ biến để xác thực (authentication) và phân quyền (authorization) cho các request. Khi người dùng đăng nhập thành công, server sẽ phát hành một token JWT chứa thông tin người dùng và các claim liên quan. Các client sau đó gửi token này trong header của request để truy cập các tài nguyên bảo vệ.

Tìm hiểu về JWT Authentication
JWT (JSON Web Token) là một tiêu chuẩn mở (RFC 7519) cho phép truyền tải thông tin một cách an toàn giữa các bên dưới dạng một đối tượng JSON. Trong ASP.NET Core Web API, JWT được sử dụng phổ biến để xác thực (authentication) và phân quyền (authorization) cho các request. Khi người dùng đăng nhập thành công, server sẽ phát hành một token JWT chứa thông tin người dùng và các claim liên quan. Các client sau đó gửi token này trong header của request để truy cập các tài nguyên bảo vệ.
Các khái niệm cơ bản của JWT
- Header: Chứa thông tin về thuật toán mã hóa và loại token (ví dụ: HS256).
- Payload: Chứa các claim (tuyên bố) về người dùng và thông tin bổ sung (như quyền truy cập, thời gian hết hạn,…).
- Signature: Được tạo bằng cách mã hóa header và payload với một secret key. Phần này giúp xác minh tính toàn vẹn của token.
Token JWT có dạng:
xxxxx.yyyyy.zzzzz
Cài đặt JWT Authentication trong ASP.NET Core Web API
Bước 1: Cài đặt package cần thiết
Chạy lệnh sau để cài đặt package cho JWT:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Cấu hình thông số JWT
Trong file appsettings.json, bạn có thể thêm các thông số cho JWT:
{
"Jwt": {
"Key": "SecretKeyToGenerateJWTToken1234567890", // Key cần giữ bí mật
"Issuer": "MyAuthServer", // Nhà cung cấp token
"Audience": "MyApiClient", // Đối tượng sử dụng token
"DurationInMinutes": 60 // Thời gian sống của token
}
}
Cấu hình JWT Authentication trong ứng dụng
Trong file Program.cs
(cho ASP.NET Core 6 trở lên), cấu hình authentication như sau:
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
var builder = WebApplication.CreateBuilder(args);
// Đọc thông số JWT từ cấu hình
var jwtSettings = builder.Configuration.GetSection("Jwt");
var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]);
// Cấu hình Authentication
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false; // Chỉ dùng trong dev, nên bật true ở production
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings["Issuer"],
ValidAudience = jwtSettings["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(key)
};
});
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
// Đăng ký Authentication & Authorization middleware
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Tạo API Controller để phát hành JWT
Dưới đây là ví dụ về một controller xác thực người dùng và trả về token JWT khi đăng nhập thành công:
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly IConfiguration _configuration;
public AuthController(IConfiguration configuration)
{
_configuration = configuration;
}
// Ví dụ đăng nhập (Login) - trong thực tế cần kiểm tra thông tin người dùng từ database
[HttpPost("login")]
public IActionResult Login([FromBody] LoginRequest request)
{
// Kiểm tra thông tin đăng nhập (ở đây giả định luôn thành công)
if (request.Username == "admin" && request.Password == "password")
{
var token = GenerateJwtToken(request.Username);
return Ok(new { Token = token });
}
return Unauthorized();
}
private string GenerateJwtToken(string username)
{
var jwtSettings = _configuration.GetSection("Jwt");
var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, username),
// Thêm các claim khác nếu cần, ví dụ: role, email,...
new Claim(ClaimTypes.Role, "Admin")
}),
Expires = DateTime.UtcNow.AddMinutes(Convert.ToDouble(jwtSettings["DurationInMinutes"])),
Issuer = jwtSettings["Issuer"],
Audience = jwtSettings["Audience"],
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
public class LoginRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
Bảo vệ các API bằng cách sử dụng Authorize Attribute
Sau khi cấu hình authentication, bạn có thể bảo vệ các controller hoặc action bằng cách sử dụng [Authorize]
:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
[ApiController]
[Authorize] // Yêu cầu phải có token hợp lệ để truy cập
public class ProductsController : ControllerBase
{
[HttpGet]
public IActionResult GetProducts()
{
// Chỉ những request đã được xác thực mới truy cập được endpoint này
return Ok(new[] { "Product1", "Product2" });
}
}
Lưu ý
- Bảo mật key: Secret key dùng để ký JWT nên được bảo mật và không nên lưu trực tiếp trong mã nguồn.
- HTTPS: Nên sử dụng HTTPS để đảm bảo token không bị đánh cắp qua giao tiếp không mã hóa.
- Token Expiration: Cần thiết kế cơ chế refresh token nếu token có thời hạn ngắn.
- Cấu hình thêm: Tùy theo nhu cầu, bạn có thể thêm nhiều claim hoặc cấu hình các chính sách phân quyền phức tạp hơn.
Kết luận
JWT Authentication là một phương pháp hiệu quả và phổ biến để bảo vệ ASP.NET Core Web API, cho phép truyền tải thông tin người dùng một cách an toàn giữa client và server. Qua việc cấu hình trong Program.cs
, phát hành token trong controller và bảo vệ các endpoint bằng [Authorize]
, bạn có thể dễ dàng tích hợp JWT vào ứng dụng của mình.
CÔNG TY TNHH GIẢI PHÁP CÔNG NGHỆ TRANG DESIGNER
Trang Designer chuyên thiết kế website chuẩn SEO, thiết kế logo toàn diện giúp doanh nghiệp xây dựng một thương hiệu mạnh và bán hàng hiệu quả trên các nền tảng số cho nhiều lĩnh vực kinh doanh.
Vui lòng liên hệ: 138 Hiền Vương, Phường Phú Thạnh, Quận Tân Phú, TP. Hồ Chí Minh
Điện thoại: 0903.728.335
Website: www.trangdesigner.id.vn