التفويض القائم على الأدوار
قيّدوا نقاط النهاية حسب أدوار المستخدمين
التفويض القائم على الأدوار درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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);
}النظير في Minimal API
تستخدم Minimal APIs .RequireAuthorization مع سياسة مضمّنة، أو يمكنك ببساطة طلب دور من خلال سياسة مُسمّاة.
app.MapDelete("/users/{id}", (int id) => Results.NoContent())
.RequireAuthorization(p => p.RequireRole("admin"));الأدوار في تسلسل هرمي
لا يحتوي ASP.NET Core على تسلسل هرمي مضمّن للأدوار. إذا كان ينبغي للمسؤولين امتلاك صلاحيات المحررين ضمنيًا، فإما أن تمنح مطالبتي الدور معًا عند تسجيل الدخول، أو أن تنمذج ذلك باستخدام السياسات (في الدورة التالية).
// Grant both at login if admin >= editor
new Claim(ClaimTypes.Role, "admin");
new Claim(ClaimTypes.Role, "editor");متى لا تكفي الأدوار
الأدوار عامة وعالية المستوى. عندما تعتمد القواعد على البيانات (مثلًا: «لا يمكن إلا للمالك التعديل») أو على صلاحيات دقيقة، تصبح عمليات التحقق من الأدوار معقدة.
هنا يأتي دور التفويض القائم على المطالبات والسياسات.
// 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اختبار سريع
اختبر معرفتك بالأدوار.
مراجعة
لقد تعلمت التفويض القائم على الأدوار:
- الأدوار هي مطالبات من النوع
ClaimTypes.Roleموضوعة في الرمز المميز. - تعني
[Authorize(Roles = "a,b")]عملية OR، بينما يعني تكديس السمات عملية AND. - يتحقق
User.IsInRoleمن الأدوار داخل التعليمات البرمجية. - الأدوار عامة وعالية المستوى؛ وتحتاج القواعد المعتمدة على البيانات إلى نماذج أكثر ثراءً.
التالي: التفويض القائم على المطالبات.
الأسئلة الشائعة
هل درس «التفويض القائم على الأدوار» مجاني؟
نعم — نص درس «التفويض القائم على الأدوار» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «التفويض القائم على الأدوار»؟
قيّدوا نقاط النهاية حسب أدوار المستخدمين تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التفويض القائم على الأدوار»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التفويض القائم على الأدوار
- التفويض القائم على المطالبات
- التفويض القائم على السياسات
- متطلبات التفويض المخصّصة