C# Academy · บทเรียน

การอนุญาตตามบทบาท

จำกัดจุดเชื่อมต่อตามบทบาทของผู้ใช้

บทเรียน 1 จาก 413 ขั้นตอน

การอนุญาตตามบทบาท เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

การยืนยันตัวตนเทียบกับการอนุญาต

การยืนยันตัวตนตอบคำถามว่า "คุณคือใคร" ส่วน การอนุญาตตอบคำถามว่า "คุณได้รับอนุญาตให้ทำอะไร"

รูปแบบการอนุญาตที่ง่ายที่สุดใน ASP.NET Core คือ การอนุญาตตามบทบาท: ผู้ใช้สังกัดบทบาทต่าง ๆ และจุดปลายทางจะกำหนดบทบาทที่ต้องมี

// User has roles: admin, editor
// Endpoint requires: admin

บทบาทมาจากที่ใด

บทบาทเป็นเพียงข้อมูลอ้างสิทธิ์ประเภท ClaimTypes.Role เมื่อออก JWT ให้เพิ่มข้อมูลอ้างสิทธิ์บทบาทหนึ่งรายการสำหรับแต่ละบทบาทที่ผู้ใช้มี

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    new Claim(ClaimTypes.Role, "admin"),
    new Claim(ClaimTypes.Role, "editor")
};

ประเภทข้อมูลอ้างสิทธิ์บทบาท

เพื่อให้ [Authorize(Roles=...)] และ User.IsInRole ทำงานได้ ตัวจัดการต้องทราบว่าประเภทข้อมูลอ้างสิทธิ์ใดใช้แทนบทบาท

คีย์ JWT role จะจับคู่กับ ClaimTypes.Role โดยค่าเริ่มต้น หากคุณใช้คีย์กำหนดเอง ให้แจ้งตัวตรวจสอบผ่าน RoleClaimType

options.TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = ClaimTypes.Role
};

การกำหนดให้ต้องมีบทบาทเดียว

ใช้ [Authorize(Roles = "admin")] กับตัวควบคุมหรือการดำเนินการ เฉพาะผู้ใช้ที่มีบทบาท admin เท่านั้นจึงจะเข้าใช้งานได้

[Authorize(Roles = "admin")]
[HttpDelete("users/{id}")]
public IActionResult DeleteUser(int id)
{
    // only admins reach here
    return NoContent();
}

การกำหนดให้ต้องมีบทบาทใดบทบาทหนึ่งจากหลายบทบาท

รายการที่คั่นด้วยจุลภาคหมายถึง OR: ผู้ใช้ต้องมีอย่างน้อยหนึ่งบทบาทจากรายการ

[Authorize(Roles = "admin,editor")]
[HttpPut("articles/{id}")]
public IActionResult Update(int id) => Ok();
// admins OR editors are allowed

การกำหนดให้ต้องมีหลายบทบาท (AND)

หากต้องการกำหนดให้ต้องมี ทั้งหมด จากหลายบทบาท ให้ซ้อนแอตทริบิวต์ [Authorize] หลายรายการ แต่ละรายการต้องผ่าน

[Authorize(Roles = "employee")]
[Authorize(Roles = "manager")]
public IActionResult ApproveBudget() => Ok();
// must be BOTH employee AND manager

การตรวจสอบบทบาทในโค้ด

บางครั้งคุณจำเป็นต้องตรวจสอบบทบาทภายในเนื้อหาเมธอด ไม่ใช่เพียงตรวจสอบที่หน้าประตูเท่านั้น ให้ใช้ User.IsInRole

public IActionResult GetReport()
{
    var data = BuildReport();
    if (User.IsInRole("admin"))
        data.IncludeSensitiveColumns();
    return Ok(data);
}

รูปแบบเทียบเท่าของ API แบบย่อ

API แบบย่อใช้ .RequireAuthorization ร่วมกับนโยบายแบบฝังในโค้ด หรือหากต้องการความง่ายยิ่งขึ้น คุณสามารถกำหนดให้ต้องมีบทบาทผ่านนโยบายที่ตั้งชื่อไว้ได้

app.MapDelete("/users/{id}", (int id) => Results.NoContent())
   .RequireAuthorization(p => p.RequireRole("admin"));

บทบาทแบบลำดับชั้น

ASP.NET Core ไม่มีลำดับชั้นบทบาทในตัว หากผู้ดูแลระบบควรมีสิทธิ์ของผู้แก้ไขโดยปริยาย ให้เพิ่ม claims ของทั้งสองบทบาทเมื่อเข้าสู่ระบบ หรือจำลองรูปแบบนี้ด้วยนโยบาย (ในหลักสูตรถัดไป)

// Grant both at login if admin >= editor
new Claim(ClaimTypes.Role, "admin");
new Claim(ClaimTypes.Role, "editor");

เมื่อบทบาทไม่เพียงพอ

บทบาทเป็นการกำหนดสิทธิ์ระดับหยาบ เมื่อกฎขึ้นอยู่กับข้อมูล (เช่น “เฉพาะเจ้าของเท่านั้นที่แก้ไขได้”) หรือสิทธิ์ที่ละเอียดมากขึ้น การตรวจสอบบทบาทจะเริ่มซับซ้อน

นี่คือจุดที่การอนุญาตตาม claims และการอนุญาตตามนโยบายเข้ามามีบทบาท

// Hard to express with roles alone:
// "editors, but only for their own department"

การส่งกลับ 403 กับ 401

หากผู้ใช้ยังไม่ผ่านการยืนยันตัวตน การตรวจสอบบทบาทจะส่งผลเป็น 401 Unauthorized หากผู้ใช้ผ่านการยืนยันตัวตนแล้วแต่ไม่มีบทบาทนั้น จะได้รับ 403 Forbidden

// No/invalid token         -> 401 Unauthorized
// Valid token, wrong role   -> 403 Forbidden

ตรวจสอบความเข้าใจ

ตรวจสอบความเข้าใจเกี่ยวกับบทบาทของคุณ

สรุปทบทวน

คุณได้เรียนรู้การอนุญาตตามบทบาท:

  • บทบาทคือ claims ของ ClaimTypes.Role ที่ใส่ไว้ในโทเค็น
  • [Authorize(Roles = "a,b")] หมายถึง OR ส่วนการซ้อนแอตทริบิวต์หมายถึง AND
  • User.IsInRole ใช้ตรวจสอบบทบาทในโค้ด
  • บทบาทมีระดับหยาบ กฎที่ขับเคลื่อนด้วยข้อมูลจึงต้องใช้แบบจำลองที่ละเอียดกว่า

ถัดไป: การอนุญาตตาม claims

เริ่มต้นได้ฟรี

เรียนรู้ C# ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
93
บทเรียน
346

คำถามที่พบบ่อย

บทเรียน “การอนุญาตตามบทบาท” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอนุญาตตามบทบาท” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การอนุญาตตามบทบาท”

จำกัดจุดเชื่อมต่อตามบทบาทของผู้ใช้ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การอนุญาตตามบทบาท” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การอนุญาตตามบทบาท
  2. การอนุญาตตามข้ออ้างสิทธิ์
  3. การอนุญาตตามนโยบาย
  4. ข้อกำหนดการอนุญาตแบบกำหนดเอง
← กลับไปที่ C# Academy