Xây dựng hệ thống phân quyền Role-based Authentication trong C# – Phần 21

Đăng ngày: 20/06/2026 • Tác giả: Quản trị viên
Xây dựng hệ thống phân quyền Role-based Authentication trong C# – Phần 21

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:

  1. Thêm Role vào Access Token khi đăng nhập.
  2. Bảo vệ API bằng [Authorize(Roles = "...")].
  3. Kiểm tra Token để cấp quyền truy cập.
  4. 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 🚀

Bài viết liên quan