อ๋อ! เข้าใจครับ 😎 โค้ดและคำอธิบายที่คุณส่งมามันอยู่ติดกันยาวมาก ทำให้อ่านยาก ผมช่วยจัด 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)]
-
AppAuthorize
-
เป็น custom attribute ที่สร้างเอง
-
ปกติสืบทอดจาก
AuthorizeAttribute
-
public class AppAuthorizeAttribute : AuthorizeAttribute
{
public AppAuthorizeAttribute()
{
// ใส่ค่า default หรือ logic เพิ่มเติม เช่น logging
}
}
-
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";
}
}
🧠 การทำงานจริง
-
เมื่อ request เข้ามา เช่น:
GET /api/admin/dashboard
-
ASP.NET Core จะตรวจสอบว่า
-
ผู้ใช้ login หรือยัง (JWT / Cookie)
-
ภายใน token มี claim ของ role = Administrator หรือไม่
-
-
ถ้า role ไม่ตรง → คืน
403 Forbidden
-
ถ้า 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 ของคุณ ให้เลย จะได้เอาไปใช้จริงกับโปรเจ็กต์ได้ ✅
คุณอยากให้ผมทำตัวอย่างนั้นต่อเลยไหมครับ?