ข้อกำหนดการอนุญาตแบบกำหนดเอง
สร้างข้อกำหนดและตัวจัดการแบบกำหนดเอง
ข้อกำหนดการอนุญาตแบบกำหนดเอง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมื่อฟังก์ชันที่มีมาให้ไม่เพียงพอ
กฎบางอย่างไม่สามารถแสดงด้วย RequireRole หรือ RequireClaim ได้ เช่น “ต้องมีอายุอย่างน้อย 18 ปี” หรือ “ต้องเป็นเจ้าของทรัพยากรนี้”
สำหรับกรณีเหล่านี้ คุณต้องเขียนข้อกำหนดและตัวจัดการแบบกำหนดเอง
// Rule: user must be older than a configurable minimum ageIAuthorizationRequirement
ข้อกำหนดคือเครื่องหมายที่เก็บข้อมูลของกฎไว้ โดยใช้อินเทอร์เฟซ IAuthorizationRequirement ซึ่งไม่มีสมาชิก
public class MinimumAgeRequirement : IAuthorizationRequirement
{
public int MinimumAge { get; }
public MinimumAgeRequirement(int minimumAge) =>
MinimumAge = minimumAge;
}AuthorizationHandler
ตัวจัดการเก็บตรรกะไว้ ให้สืบทอดจาก AuthorizationHandler<TRequirement> และแทนที่ HandleRequirementAsync
public class MinimumAgeHandler
: AuthorizationHandler<MinimumAgeRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
MinimumAgeRequirement requirement)
{
// logic goes here
return Task.CompletedTask;
}
}การทำให้ข้อกำหนดสำเร็จ
ภายในตัวจัดการ ให้ตรวจสอบ claims ของผู้ใช้ หากกฎเป็นจริง ให้เรียก context.Succeed(requirement) หากไม่เป็นจริง ให้คืนการทำงานโดยไม่เรียกเมธอดดังกล่าว
var dobClaim = context.User.FindFirst("birthdate");
if (dobClaim is null) return Task.CompletedTask;
var dob = DateTime.Parse(dobClaim.Value);
int age = DateTime.UtcNow.Year - dob.Year;
if (dob > DateTime.UtcNow.AddYears(-age)) age--;
if (age >= requirement.MinimumAge)
context.Succeed(requirement);
return Task.CompletedTask;เรียก Succeed ไม่ใช่ Fail
ควรเรียก Succeed เมื่อข้อกำหนดผ่าน และไม่ต้องทำอะไรในกรณีอื่น เรียก context.Fail() เฉพาะเมื่อต้องการรับประกันว่าการอนุญาตจะล้มเหลว โดยไม่ขึ้นกับตัวจัดการอื่นที่จัดการข้อกำหนดเดียวกัน
// Soft: let other handlers also try
if (ok) context.Succeed(requirement);
// Hard: force failure no matter what
if (blocked) context.Fail();การลงทะเบียนตัวจัดการ
ลงทะเบียนตัวจัดการใน DI เป็น IAuthorizationHandler โดยปกติตัวจัดการเหล่านี้จะเป็นอินสแตนซ์เดียว เว้นแต่จะขึ้นอยู่กับบริการตามขอบเขต
builder.Services.AddSingleton<
IAuthorizationHandler, MinimumAgeHandler>();การผูกเข้ากับนโยบาย
เพิ่มข้อกำหนดลงในนโยบายที่ตั้งชื่อไว้ด้วย AddRequirements (หรือ Requirements.Add) ระบบจะจับคู่ตัวจัดการตามชนิดให้โดยอัตโนมัติ
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast18", policy =>
policy.AddRequirements(new MinimumAgeRequirement(18)));
});การใช้นโยบาย
ใช้นโยบายนี้เช่นเดียวกับนโยบายที่ตั้งชื่อไว้อื่น ๆ
[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();การอนุญาตตามทรัพยากร
หากต้องการอนุญาตโดยอ้างอิงอินสแตนซ์เฉพาะรายการ (เช่น “เฉพาะเจ้าของเอกสารเท่านั้นที่แก้ไขได้”) ให้ใช้รูปแบบโอเวอร์โหลดที่รับทรัพยากร ทรัพยากรจะถูกส่งเข้าไปในบริบทของตัวจัดการ
public class OwnerHandler
: AuthorizationHandler<OwnerRequirement, Document>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
OwnerRequirement requirement,
Document resource)
{
var userId = context.User.FindFirstValue(
ClaimTypes.NameIdentifier);
if (resource.OwnerId.ToString() == userId)
context.Succeed(requirement);
return Task.CompletedTask;
}
}การเรียกใช้ IAuthorizationService
การตรวจสอบตามทรัพยากรจะทำแบบสั่งการภายในการทำงานหนึ่งรายการผ่าน IAuthorizationService ที่ถูกแทรกเข้ามา
public async Task<IActionResult> Edit(int id)
{
var doc = await _db.Documents.FindAsync(id);
var result = await _authz.AuthorizeAsync(
User, doc, "DocumentOwner");
if (!result.Succeeded) return Forbid();
return Ok(doc);
}ตัวจัดการหลายรายการต่อข้อกำหนดหนึ่งรายการ
ข้อกำหนดหนึ่งรายการมีตัวจัดการได้หลายรายการ หากตัวจัดการใด ๆ ทำให้ข้อกำหนดสำเร็จ ข้อกำหนดนั้นก็ถือว่าผ่าน วิธีนี้จำลองเงื่อนไขแบบ OR ได้อย่างชัดเจน (เว้นแต่ตัวจัดการจะเรียก Fail)
// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();ตรวจสอบความเข้าใจ
ตรวจสอบความเข้าใจเกี่ยวกับตัวจัดการ
สรุปทบทวน
คุณได้สร้างการอนุญาตแบบกำหนดเอง:
IAuthorizationRequirementเก็บข้อมูลของกฎAuthorizationHandler<T>เก็บตรรกะและเรียกSucceed- ลงทะเบียนตัวจัดการเป็น
IAuthorizationHandlerและผูกข้อกำหนดเข้ากับนโยบาย - ตัวจัดการตามทรัพยากรและ
IAuthorizationServiceใช้อนุญาตอินสแตนซ์เฉพาะรายการ
หลักสูตรการอนุญาตจบลงเพียงเท่านี้
คำถามที่พบบ่อย
บทเรียน “ข้อกำหนดการอนุญาตแบบกำหนดเอง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ข้อกำหนดการอนุญาตแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ข้อกำหนดการอนุญาตแบบกำหนดเอง”
สร้างข้อกำหนดและตัวจัดการแบบกำหนดเอง คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ข้อกำหนดการอนุญาตแบบกำหนดเอง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอนุญาตตามบทบาท
- การอนุญาตตามข้ออ้างสิทธิ์
- การอนุญาตตามนโยบาย
- ข้อกำหนดการอนุญาตแบบกำหนดเอง