Xây dựng hệ thống phân quyền Role-based Authentication trong C# – Phần 21
1. Giới thiệu về Role-based Authentication
🔹 Role-based Authentication (Xác thực dựa trên vai trò) cho phép kiểm soát quyền truy cập vào API dựa trên vai trò của người dùng.
🔹 Ví dụ:
✅ Admin có thể tạo/sửa/xóa người dùng.
✅ User chỉ có thể xem thông tin cá nhân.
📌 Lợi ích:
✅ Kiểm soát truy cập API chặt chẽ.
✅ Dễ dàng mở rộng hệ thống theo vai trò.
✅ Tăng cường bảo mật ứng dụng.
2. Cấu hình Roles trong ASP.NET Core
Thêm Claim Role vào Access Token
📌 Cập nhật hàm GenerateJwtToken() trong AuthController.cs
private string GenerateJwtToken(string username, string role)
{
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(ClaimTypes.Role, role), // Thêm Role vào Token
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
_config["Jwt:Issuer"],
_config["Jwt:Audience"],
claims,
expires: DateTime.UtcNow.AddMinutes(Convert.ToDouble(_config["Jwt:AccessTokenExpirationMinutes"])),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
📌 Khi tạo Token, Role sẽ được đính kèm trong Claim.
3. Cập nhật API Đăng Nhập để phân quyền
[HttpPost("login")]
public IActionResult Login([FromBody] UserLogin user)
{
// Kiểm tra user từ DB (tạm thời hardcode)
if (user.Username == "admin" && user.Password == "123456")
{
var token = GenerateJwtToken(user.Username, "Admin");
return Ok(new { token });
}
else if (user.Username == "user" && user.Password == "123456")
{
var token = GenerateJwtToken(user.Username, "User");
return Ok(new { token });
}
return Unauthorized();
}
📌 Tùy vào Username, hệ thống cấp Token có Role tương ứng.
4. Bảo vệ API bằng [Authorize(Roles = "...")]
📌 Thêm API có phân quyền trong RoleController.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/role")]
[ApiController]
public class RoleController : ControllerBase
{
[HttpGet("admin-only")]
[Authorize(Roles = "Admin")]
public IActionResult GetAdminData()
{
return Ok(new { message = "Chỉ Admin mới có thể xem dữ liệu này!" });
}
[HttpGet("user-only")]
[Authorize(Roles = "User")]
public IActionResult GetUserData()
{
return Ok(new { message = "Chỉ User mới có thể xem dữ liệu này!" });
}
[HttpGet("all")]
[Authorize]
public IActionResult GetAllRoles()
{
return Ok(new { message = "Cả Admin và User đều có thể truy cập!" });
}
}
📌 Giải thích:
✅ Admin chỉ có thể truy cập /api/role/admin-only.
✅ User chỉ có thể truy cập /api/role/user-only.
✅ Cả hai có thể truy cập /api/role/all.
5. Kiểm thử API Role-based Authentication
📌 1. Đăng nhập với Admin để lấy Token
✅ Gửi POST request đến api/auth/login với JSON:
{
"username": "admin",
"password": "123456"
}
✅ Nhận về JWT Token có Role = “Admin”
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}
📌 2. Đăng nhập với User để lấy Token
✅ Gửi POST request đến api/auth/login với JSON:
{
"username": "user",
"password": "123456"
}
✅ Nhận về JWT Token có Role = “User”
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}
📌 3. Kiểm thử API với Token của Admin
🔹 Gửi request GET http://localhost:5000/api/role/admin-only
✅ Kết quả:
{
"message": "Chỉ Admin mới có thể xem dữ liệu này!"
}
🔹 Gửi request GET http://localhost:5000/api/role/user-only
🚫 Kết quả:
{
"status": 403,
"message": "Forbidden"
}
📌 Admin không thể truy cập API dành cho User.
📌 4. Kiểm thử API với Token của User
🔹 Gửi request GET http://localhost:5000/api/role/user-only
✅ Kết quả:
{
"message": "Chỉ User mới có thể xem dữ liệu này!"
}
🔹 Gửi request GET http://localhost:5000/api/role/admin-only
🚫 Kết quả:
{
"status": 403,
"message": "Forbidden"
}
📌 User không thể truy cập API dành cho Admin.
6. Tổng Kết
✅ Xác thực dựa trên Role giúp kiểm soát quyền truy cập tốt hơn.
✅ Sử dụng [Authorize(Roles = "...")] để phân quyền API.
✅ Token chứa thông tin Role giúp kiểm tra quyền truy cập.
📌 Các bước chính:
- Thêm Role vào Access Token khi đăng nhập.
- Bảo vệ API bằng
[Authorize(Roles = "...")]. - Kiểm tra Token để cấp quyền truy cập.
- Kiểm thử API với Admin và User để đảm bảo phân quyền chính xác.
💡 Bài tiếp theo:
👉 Tích hợp Identity Framework để quản lý User & Role trong C# – Phần 22 🚀