إضافة دعم الأمان التصريحي
على الرغم من أنه غير مطلوب إلزاماً، يجب أن يدعم الإذن المخصص الأمان التصريحي بحيث يمكن للمطورين تحديد الإذن المخصص عند استخدام بناء الجملة التصريحي لإجراءات الأمان مثل المُطالبات، أو الطلبات أو التأكيدات. في الحقيقة، يمكن إنشاء طلبات الإذن، المُطالبات الارتباطية، و مُطالبات الوراثة، فقط بشكل تصريحي. لهذا السبب، لا يمكن طلب أو استخدام إذن الوصول إلى التعليمات البرمجية المخصص الخاص بك مع المُطالبات الارتباطية أو مُطالبات الوراثة ما لم توفر الدعم للأمان التصريحي. يصف هذا الموضوع كيفية تطبيق الفئة Attribute و التي تمكّن اعتماد الأمان التصريحي للأذونات المخصصة الخاصة بك.
ملاحظة |
---|
يجب تعريف إصدار السمة للأذونات المخصصة في كائن تجميع غير التجميع التي يتم الإشارة إليه فيه.يجب أيضاً أن يتم تعريف الإذن في هذا التجميع.و يعد هذا إلزامياً للأمان التصريحي، لأنه يتم تنفيذ السمة عند تحميل التجميع، و يمكن ألا يكون قد تم إنشاء السمة في وقت مصادفة مرجع يشير إليها.و ينتج عن محاولة استخدام إذن تصريحي في نفس التجميع المعرّف فيه إلى طرح TypeLoadException. |
يجب أن تشتق سمات الأمان للتعريفات (بشكل مباشر أو غير مباشر) من الفئة SecurityAttribute. إذا كان الإذن يعد من أذونات أمان الوصول إلى التعليمات البرمجية، تشتق السمة من CodeAccessSecurityAttribute ، والذي يشتق بدوره من SecurityAttribute. يجب أن تطبق فئات سمة الأمان الأسلوب CreatePermission والذي يقوم بإنشاء مثيل لكائن إذن من الأذونات المخصصة المقترنة. لاحظ أنه يجب وضع علامة على فئة الأذونات المخصصة المقترنة تلك بالعلامة SerializableAttribute لكي يمكن إجراء عملية تحويل تسلسلي إلى بيانات التعريف بواسطة برنامج التحويل البرمجي. لمزيد من المعلومات، راجع تطبيق أذونات مخصصة.
تطبق التعليمات البرمجية التالية فئة سمة لإذن قيمة منطقية (Boolean) تحت اسم CustomPermission. في هذا المثال، تحتوي فئة الإذن على خاصية قيمة منطقية واحدة Unrestricted والتي تحتوي على الحالة الخاصة به.
<AttributeUsageAttribute(AttributeTargets.All, AllowMultiple := True)> Public Class
CustomPermissionAttribute
Inherits CodeAccessSecurityAttribute
Private myUnrestricted As Boolean = False
Public Shadows Property Unrestricted() As Boolean
Get
Return myUnrestricted
End Get
Set
myUnrestricted = value
End Set
End Property
Public Sub New(action As SecurityAction)
MyBase.New(action)
End Sub
Public Overrides Function CreatePermission() As IPermission
If Unrestricted Then
Return New CustomPermission(PermissionState.Unrestricted)
Else
Return New CustomPermission(PermissionState.None)
End If
End Function
End Class
[AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
public class CustomPermissionAttribute: CodeAccessSecurityAttribute
{
bool unrestricted = false;
public new bool Unrestricted
{
get{ return unrestricted; }
set{ unrestricted = value; }
}
public CustomPermissionAttribute(SecurityAction action): base (action)
{
}
public override IPermission CreatePermission()
{
if(Unrestricted)
{
return new CustomPermission(PermissionState.Unrestricted);
}
else
{
return new CustomPermission(PermissionState.None);
}
}
}
في هذه الحالة، يتحقق CreatePermission من الخاصية الداخلية Unrestricted ويقوم بإنشاء مثيل مناسب من الكائن CustomPermission. على الرغم من أنه يتم استخدام الخاصية Unrestricted في هذه الحالة، يجب أن تدعم فئات الإذن المخصصة الأخرى كافة الحالات الممكنة لكائنات الإذن التي تدعمها.
استخدام CustomPermissionAttribute موضح في تعريف الطلب التالي:
<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := true)>
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
راجع أيضًا:
المرجع
المبادئ
لتوسيع بيانات التعريف باستخدام السمات
إنشاء أذونات الوصول للتعليمات البرمجية الخاصة بك.