Attribute-based Authorization [AppAuthorize] ใน ASP.NET Core

By suparat · 08 Oct 2025


อ๋อ! เข้าใจครับ 😎 โค้ดและคำอธิบายที่คุณส่งมามันอยู่ติดกันยาวมาก ทำให้อ่านยาก ผมช่วยจัด format ใหม่ ให้เป็นสไตล์อ่านง่าย แบ่งเป็นหัวข้อ ชัดเจน พร้อม block code แยกกันทุกส่วน ✅


🔹 Attribute-based Authorization [AppAuthorize] ใน ASP.NET Core

บรรทัดนี้:

[AppAuthorize(Roles = AppConst.Roles.Administrator)]

หมายถึง:

“Controller หรือ Action นี้ ต้องผ่านการตรวจสอบสิทธิ์ (Authorize) และต้องมี Role = Administrator เท่านั้น ถึงจะเข้าได้”

มันคล้ายกับ [Authorize(Roles = "Administrator")] ของ ASP.NET Core ปกติ แต่ AppAuthorize เป็น Custom Attribute ที่คุณสร้างเอง เพื่อใส่ logic เพิ่มเติม เช่น JWT, Logging หรือ Policy ต่าง ๆ


🧩 ส่วนประกอบของ [AppAuthorize]

[AppAuthorize(Roles = AppConst.Roles.Administrator)]
  1. AppAuthorize

    • เป็น custom attribute ที่สร้างเอง

    • ปกติสืบทอดจาก AuthorizeAttribute

public class AppAuthorizeAttribute : AuthorizeAttribute
{
    public AppAuthorizeAttribute()
    {
        // ใส่ค่า default หรือ logic เพิ่มเติม เช่น logging
    }
}
  1. Roles = AppConst.Roles.Administrator

    • Roles เป็น property ของ AuthorizeAttribute

    • ระบุว่า controller/action ต้องการ role ไหน

    • AppConst.Roles.Administrator คือ constant เก็บชื่อ role ไว้

public static class AppConst
{
    public static class Roles
    {
        public const string Administrator = "Administrator";
        public const string Manager = "Manager";
        public const string User = "User";
    }
}

🧠 การทำงานจริง

  1. เมื่อ request เข้ามา เช่น:

GET /api/admin/dashboard
  1. ASP.NET Core จะตรวจสอบว่า

    • ผู้ใช้ login หรือยัง (JWT / Cookie)

    • ภายใน token มี claim ของ role = Administrator หรือไม่

  2. ถ้า role ไม่ตรง → คืน 403 Forbidden

  3. ถ้า role ตรง → อนุญาตเข้าถึง action ได้


🧰 ตัวอย่างใช้งานจริง

🔸 Controller

[ApiController]
[Route("api/[controller]")]
public class AdminController : ControllerBase
{
    [AppAuthorize(Roles = AppConst.Roles.Administrator)]
    [HttpGet("dashboard")]
    public IActionResult GetDashboard()
    {
        return Ok("Welcome Admin!");
    }
}

🔸 ตัวอย่าง JWT Payload

{
  "sub": "user123",
  "role": "Administrator",
  "exp": 1735000000
}

💡 ทำ Custom Logic เพิ่มใน AppAuthorize

สามารถ override method และ check role + login + logging เองได้

public class AppAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;

        // ตรวจว่า login หรือไม่
        if (!user.Identity?.IsAuthenticated ?? false)
        {
            context.Result = new UnauthorizedResult();
            return;
        }

        // ตรวจ role
        if (!user.IsInRole(Roles))
   

🔒 สรุปง่าย ๆ

สิ่งที่ทำได้ ความหมาย
[AppAuthorize] ต้อง login ถึงเข้าได้
[AppAuthorize(Roles = "Administrator")] ต้องเป็น admin ถึงเข้าได้
[AppAuthorize(Roles = "Manager,Administrator")] มี role ใด role หนึ่งเข้าได้
[AllowAnonymous] เปิดให้เข้าถึงได้โดยไม่ต้อง login

ถ้าคุณต้องการ ผมสามารถต่อให้เป็น ตัวอย่างสร้าง AppAuthorizeAttribute แบบรวม JWT + Role Check + Logging สำหรับ N-tier project ของคุณ ให้เลย จะได้เอาไปใช้จริงกับโปรเจ็กต์ได้ ✅

คุณอยากให้ผมทำตัวอย่างนั้นต่อเลยไหมครับ?

Attribute-based Authorization [AppAuthorize] ใน ASP.NET Core
Web hosting by Somee.com