การอนุญาตตามบทบาท
จำกัดจุดเชื่อมต่อตามบทบาทของผู้ใช้
การอนุญาตตามบทบาท เป็นบทเรียน 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 ส่วนการซ้อนแอตทริบิวต์หมายถึง ANDUser.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ