0Pricing
C# Academy · درس

متطلبات التفويض المخصّصة

أنشئوا متطلبات ومعالجات مخصّصة

متطلبات التفويض المخصّصة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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;
    }
}

استيفاء المتطلب

افحص مطالبات المستخدم داخل المعالج. إذا استوفيت القاعدة، فاستدعِ 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 بالوصول إلى مثيلات محددة.

وبذلك تكتمل دورة التفويض.

الأسئلة الشائعة

هل درس «متطلبات التفويض المخصّصة» مجاني؟

نعم — نص درس «متطلبات التفويض المخصّصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «متطلبات التفويض المخصّصة»؟

أنشئوا متطلبات ومعالجات مخصّصة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «متطلبات التفويض المخصّصة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التفويض القائم على الأدوار
  2. التفويض القائم على المطالبات
  3. التفويض القائم على السياسات
  4. متطلبات التفويض المخصّصة
← العودة إلى C# Academy