Bảo mật API với JWT Authentication trong C# – Phần 19
1. Giới thiệu về JWT Authentication
JWT (JSON Web Token) là một chuẩn mở giúp xác thực người dùng trong các ứng dụng web và API.
🔹 Lợi ích của JWT:
✅ Xác thực không trạng thái (Stateless).
✅ Bảo mật cao với mã hóa.
✅ Dễ dàng triển khai trên API RESTful.
2. Cài đặt ASP.NET Core JWT Authentication
👉 Cài đặt thư viện JWT:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
👉 Thêm cấu hình JWT trong appsettings.json
"Jwt": {
"Key": "Your_Secret_Key_123456789",
"Issuer": "yourdomain.com",
"Audience": "yourdomain.com"
}
📌 Key phải mạnh và bảo mật, không nên để công khai.
3. Cấu hình JWT trong Program.cs
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
var key = Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"]
};
});
builder.Services.AddAuthorization();
builder.Services.AddControllers();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
📌 Quan trọng:
✅ UseAuthentication() phải được gọi trước UseAuthorization().
✅ TokenValidationParameters giúp kiểm tra tính hợp lệ của JWT.
4. Tạo Token trong AuthController.cs
👉 Tạo controller AuthController.cs để đăng nhập và cấp JWT:
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[Route("api/auth")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly IConfiguration _config;
public AuthController(IConfiguration config)
{
_config = config;
}
[HttpPost("login")]
public IActionResult Login([FromBody] UserLogin user)
{
if (user.Username == "admin" && user.Password == "123456") // Kiểm tra user (có thể dùng DB)
{
var token = GenerateJwtToken(user.Username);
return Ok(new { token });
}
return Unauthorized();
}
private string GenerateJwtToken(string username)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(ClaimTypes.Name, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
_config["Jwt:Issuer"],
_config["Jwt:Audience"],
claims,
expires: DateTime.UtcNow.AddHours(1),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
public class UserLogin
{
public string Username { get; set; }
public string Password { get; set; }
}
📌 Cách sử dụng:
✅ Gửi POST request đến api/auth/login với JSON:
{
"username": "admin",
"password": "123456"
}
✅ Nhận về JWT Token để sử dụng trong API.
5. Bảo vệ API bằng [Authorize]
👉 Thêm [Authorize] vào các API cần bảo vệ:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/protected")]
[ApiController]
[Authorize]
public class ProtectedController : ControllerBase
{
[HttpGet]
public IActionResult GetProtectedData()
{
return Ok(new { message = "Bạn đã truy cập thành công API bảo vệ!" });
}
}
6. Kiểm thử API với JWT
🔹 Gửi request GET http://localhost:5000/api/protected mà không có token
🚫 Kết quả:
{
"status": 401,
"message": "Unauthorized"
}
🔹 Gửi request với JWT Token:
✅ Thêm Authorization Header:
Authorization: Bearer <your_jwt_token>
✅ Kết quả:
{
"message": "Bạn đã truy cập thành công API bảo vệ!"
}
7. Tổng Kết
✅ JWT Authentication giúp API bảo mật hơn.
✅ Xác thực người dùng bằng cách kiểm tra Username/Password.
✅ Tạo JWT Token và gửi về client.
✅ Bảo vệ API bằng [Authorize] trong controller.
📌 Các bước chính:
- Cài đặt gói JWT Authentication.
- Thêm cấu hình JWT trong
appsettings.json. - Cấu hình xác thực trong
Program.cs. - Tạo API đăng nhập để cấp Token.
- Bảo vệ API bằng
[Authorize]. - Gửi request có kèm JWT Token để truy cập API.
💡 Bài tiếp theo:
👉 Bảo mật API với Refresh Token trong C# – Phần 20 🚀