0Pricing
C# Academy · บทเรียน

ข้อกำหนดการอนุญาตแบบกำหนดเอง

สร้างข้อกำหนดและตัวจัดการแบบกำหนดเอง

ข้อกำหนดการอนุญาตแบบกำหนดเอง เป็นบทเรียน 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 age

IAuthorizationRequirement

ข้อกำหนดคือเครื่องหมายที่เก็บข้อมูลของกฎไว้ โดยใช้อินเทอร์เฟซ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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