مكتبة مساعدة لتنفيذ التحكم في الوصول القائم على السمات (ABAC) مع رموز الويب JSON باستخدام التحكم القائم على السياسة في ASP.NET CORE (PBAC).
إنشاء أذونات تعداد:
public enum Permissions
{
Create = 0 ,
Read = 1 ,
Update = 2 ,
Delete = 3 ,
}لاحظ أن وجود القيمة الكامنة الدقيقة لكل إذن أمر مهم - فإن عبثه سيوضح الأذونات المخزنة!
وأيضًا ، يتم دعم التعدادات فقط مع int كنوع أساسي (الافتراضي) حاليًا.
اضبط قيم إذن المستخدم داخل مزود الهوية الخاص بك باستخدام PermissionSet :
user . Claims [ ClaimNames . Permissions ] = new PermissionSet < Permissions > ( new [ ]
{
Permissions . Create ,
Permissions . Read ,
} )
. ToCompactString ( ) ;أضف معالج متطلبات سياسة الإذن بنفس اسم المطالبة على النحو الوارد أعلاه:
services . AddPermissionBasedAuthorization < Permissions > ( options =>
options . PermissionsClaimName = ClaimNames . Permissions ) ; لاحظ أنه إذا قمت بإعادة تعريف التفويض DefaultPolicy في تطبيقك ، فيجب إدراج الرمز أعلاه بعد منطقك لجعل سياسات الإذن ترث السياسة الافتراضية الجديدة.
(اختياريا) وراثة AuthorizePermission<T> مع نوع التعداد الأذونات المحددة:
public class AuthorizePermissionAttribute : AuthorizePermissionAttribute < Permissions >
{
public AuthorizePermissionAttribute ( Permissions permission )
: base ( permission )
{ }
}أو قم بإنشاء طريقة تمديد في حالة استخدام الحد الأدنى من واجهات برمجة التطبيقات:
public static TBuilder RequirePermission < TBuilder > ( this TBuilder builder , Permissions permission )
where TBuilder : IEndpointConventionBuilder
{
if ( builder == null )
throw new ArgumentNullException ( nameof ( builder ) ) ;
return builder . RequireAuthorization ( new AuthorizePermissionAttribute < Permissions > ( permission ) ) ;
} تزيين وحدات التحكم/نقاط النهاية مع سمة AuthorizePermission<T> (أو تلك التي تم إنشاؤها أعلاه):
[ HttpGet ]
[ Authorize ( Permissions . Read ) ]
public IActionResult Get ( )
=> Ok ( ) ;أو إذا كان استخدام الحد الأدنى لواجهة برمجة التطبيقات:
app . MapGet ( "/" , ( ) => Results . Ok ( ) )
. RequirePermission ( Permissions . Read ) ; يتم تسلسل مجموعة الإذن في سلسلة كرقم سداسي حيث تمثل بت n -th وجود إذن مع القيمة الأساسية لـ n .
على سبيل المثال ، ضع في اعتبارك التعداد التالي:
public enum Permissions
{
Create = 0,
Read = 1,
Update = 2,
Delete = 3,
Manage = 4,
}
ثم ، فإن التمثيل الثنائي لمجموعة تحتوي على جميع الأذونات أعلاه سيبدو هكذا:
1 F - permission string
┌┬┬┤ ┌┬┬┤
0001 1111 - permission bit values
││││ ││││
7654 3210 - bit positions
└┬┘│ ││││
│ │ │││└ Create
│ │ ││└ Read
│ │ │└ Update
│ │ └ Delete
│ └ Manage
└ Not used
من أجل التخلص من ذلك ، يتم ما سبق بالترتيب العكسي.
أيضًا ، نظرًا لقيمة التعداد ، يمكننا حساب موضع البتات المحددة التي نحتاج إلى التحقق منها ، لا نحتاج إلى إلغاء تمييز السلسلة بأكملها عندما نتحقق من إذن واحد.
التحقق من قيمة إذن واحدة من السلسلة المدمجة:
| طريقة | يقصد | خطأ | Stddev | مخصص |
|---|---|---|---|---|
| أذونات _haspermission | 74.17 ns | 1.382 ns | 1.225 ns | - |
التحقق من صحة المستخدم لديه إذن مطلوب في قائمة المطالبة الخاصة بهم:
| طريقة | يقصد | خطأ | Stddev | مخصص |
|---|---|---|---|---|
| SERMISSEATHORISTYHALDLERNGMARK_HALDLEREQUIREMENTASYNC | 359.4 NS | 6.79 ns | 13.25 ns | 144 ب |