في بعض الأحيان تعمل تطبيقات asp.net التي نكتبها على مضيفين افتراضيين. ربما قامت بعض المضيفات الافتراضية بتعيين أذونات على asp.net لاعتبارات أمنية، مما سيؤدي إلى فشل تشغيل تطبيقاتنا بشكل صحيح.
أعراض المشكلة:
لسبب ما، يتعذر على asp.net تحميل بعض ملفات dll، وتظهر رسالة الخطأ التالية: خطأ في الخادم في التطبيق '/'.
---------------------------------------------
لا يمكن الحصول على الأذونات المطلوبة .
الوصف: حدث استثناء غير معالج أثناء تنفيذ طلب الويب الحالي، يرجى مراجعة تتبع المكدس للحصول على مزيد من المعلومات حول الخطأ ومكان نشأته في التعليمات البرمجية.
تفاصيل الاستثناء: System.Security.Policy.PolicyException: لا يمكن الحصول على الأذونات المطلوبة.
خطأ في المصدر:
تم
إنشاء استثناء غير معالج أثناء تنفيذ طلب الويب الحالي. يمكن تحديد المعلومات المتعلقة بأصل الاستثناء وموقعه باستخدام تتبع مكدس الاستثناءات أدناه
:
[PolicyException: لا يمكن الحصول على الأذونات المطلوبة.]
System.Security.SecurityManager.ResolvePolicy (دليل الأدلة، PermissionSet reqdPset، PermissionSet optPset، PermissionSet DenyPset، PermissionSet& مرفوض، checkExecutionPermission المنطقي) +2738293
System.Security.SecurityManager.ResolvePolicy (دليل الأدلة، PermissionSet reqdPset، PermissionSet optPset، PermissionSet DenPset، PermissionSet& مرفوض، Int32&securitySpecialFlags، Boolean checkExecutionPermission) +57
[FileLoadException: تعذر تحميل الملف أو التجميع 'Microsoft.Practices.ObjectBuilder، الإصدار=1.0 .51205.0، Culture=محايد، PublicKeyToken=null' أو أحد تبعياته فشل في منح الحد الأدنى من طلبات الأذونات (استثناء من HRESULT: 0x80131417)]
System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence AssemblySecurity, Assembly locationHint, StackCrawlMark & StackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.InternalLoad(AssemblyName AssemblyRef, Evidence AssemblySecurity, StackCrawlMark&stackMark, Boolean forIntrospection) +211
System.Reflection.Assembly.InternalLoad(String AssemblyString, Evidence AssemblySecurity, StackCrawlMark&stackMark, Boolean forIntrospection) +141
System.Reflection.Assembly.Load(String AssemblyString) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String AssemblyName, Boolean starDirective) +32
تحليل المشكلة:
وفقًا لملاحظتي، يمكن تحميل ملف dll الذي تم إنشاؤه مباشرة بواسطة تطبيق asp.net بشكل طبيعي، ويمكن أيضًا تحميل ملف dll الخارجي الذي يتم استدعاؤه مباشرة بواسطة asp.net بشكل طبيعي، ولكن لا يمكن تحميل ملفات dll الخارجية الأخرى التي يتم الرجوع إليها فقط بواسطة ملف dll الخارجي محملة. تخميني هو: نظرًا لأن الأذونات غير مكتملة، يمكن لمكتبات الارتباط الحيوي (DLL) التي تم إنشاؤها بواسطة تطبيق asp.net نفسه ومكتبات الارتباط الحيوي (DLL) المشار إليها مباشرةً الحصول على أذونات من خلال وراثة الأذونات، بينما لا يمكن لمكتبات الارتباط الحيوي (DLL) الخارجية الأخرى التي يتم الرجوع إليها فقط بواسطة مكتبات الارتباط الحيوي (DLL) الخارجية أن ترث الأذونات بسبب قيود الأذونات. لذلك هناك مشكلة عدم كفاية الأذونات.
حل المشكلة:
من خلال التجارب التي أجريت على جهاز الكمبيوتر الخاص بي، من المتوقع أن إعدادات ملف web.config الجذر (موقعه على جهاز الكمبيوتر الخاص بي هو C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG) قد تم تعديلها على المضيف الظاهري.
قسم إعداد أذونات web.config الافتراضي هو كما يلي:
<الموقع يسمح بتجاوز = "صحيح">
<system.web>
<سياسة الأمان>
<trustLevel name="Full" PolicyFile="internal" />
<trustLevel name="High" PolicyFile="web_hightrust.config" />
<trustLevel name="Medium" PolicyFile="web_mediumtrust.config" />
<trustLevel name="Low" PolicyFile="web_lowtrust.config" />
<trustLevel name="Minimal" PolicyFile="web_minimaltrust.config" />
</السياسة الأمنية>
<مستوى الثقة = "كامل" OriginUrl = "" />
</system.web>
</الموقع>
من المفترض أن تكون الإعدادات المعدلة على المضيف الظاهري: <locationallowOverride="false">
<system.web>
<سياسة الأمان>
<trustLevel name="Full" PolicyFile="internal" />
<trustLevel name="High" PolicyFile="web_hightrust.config" />
<trustLevel name="Medium" PolicyFile="web_mediumtrust.config" />
<trustLevel name="Low" PolicyFile="web_lowtrust.config" />
<trustLevel name="Minimal" PolicyFile="web_minimaltrust.config" />
</السياسة الأمنية>
<مستوى الثقة = "عالي" OriginUrl = "" />
</system.web>
</location> يقوم أولاً بتعيينallowOverride على false، مما يمنع القدرة على إعادة تعريف الأذونات في web.config الخاص بالمستخدم. ثم قام بتعريف مستوى الثقة على أنه مرتفع بدلاً من المستوى الافتراضي الكامل. بعد الاختبار، طالما أن مستوى الثقة ليس ممتلئًا، لا يمكن تحميل ملفات dll الخارجية الأخرى التي يتم الرجوع إليها فقط بواسطة ملف dll الخارجي. ولذلك، أوصي بأن يقوم الدعم الفني بتعيين قسمallowOverride على القيمة true. بهذه الطريقة يمكنني إعادة تحديد الأذونات في web.config.
مثال: <trustlevel="Full" OriginUrl="" />
لم أدرس موقع aps.net مؤخرًا، لذلك لم أبحث بعناية عن الأسباب الأساسية، ربما يكون فهمي خاطئًا. آمل أن يخبرني الخبير بالأسباب الأساسية أو يصحح أخطائي.