Terkadang aplikasi asp.net yang kami tulis berjalan di host virtual. Beberapa virtual host mungkin telah menetapkan izin pada asp.net karena pertimbangan keamanan, yang akan menyebabkan aplikasi kita gagal berjalan dengan baik.
Gejala masalah:
Untuk beberapa alasan, asp.net tidak dapat memuat beberapa file dll, dan pesan kesalahan berikut muncul: Server Error in '/' Application.
---------------------------------------------
Izin yang diperlukan tidak dapat diperoleh .
Deskripsi
: Pengecualian yang tidak tertangani terjadi selama eksekusi permintaan web saat ini. Harap tinjau pelacakan tumpukan untuk informasi lebih lanjut tentang kesalahan dan asal usulnya dalam kode
.
Kesalahan Sumber:
Pengecualian yang tidak tertangani dihasilkan selama eksekusi permintaan web saat ini. Informasi mengenai asal dan lokasi pengecualian dapat diidentifikasi menggunakan pelacakan tumpukan pengecualian di bawah ini
.
[PolicyException: Izin yang diperlukan tidak dapat diperoleh.]
System.Security.SecurityManager.ResolvePolicy(Bukti bukti, PermissionSet reqdPset, PermissionSet optPset, PermissionSet rejectPset, PermissionSet& ditolak, Boolean checkExecutionPermission) +2738293
System.Security.SecurityManager.ResolvePolicy(Bukti bukti, PermissionSet reqdPset, PermissionSet optPset, PermissionSet rejectPset, PermissionSet& ditolak, Int32& securitySpecialFlags, Boolean checkExecutionPermission) +57
[FileLoadException: Tidak dapat memuat file atau rakitan 'Microsoft.Practices.ObjectBuilder, Version=1.0 .51205.0, Culture=neutral, PublicKeyToken=null' atau salah satu dependensinya. Gagal memberikan permintaan izin minimum (Pengecualian dari HRESULT: 0x80131417)]
System.Reflection.Assembly.nLoad(NamafileAssemblyName, String codeBase, Keamanan perakitan bukti, Petunjuk lokasi perakitan, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean untukIntrospeksi) +0
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Bukti perakitanSecurity, StackCrawlMark& stackMark, Boolean untuk Introspeksi) +211
System.Reflection.Assembly.InternalLoad(String assemblyString, Bukti perakitanSecurity, StackCrawlMark& stackMark, Boolean untuk Introspeksi) +141
Sistem.Refleksi.Perakitan.Beban(String perakitanString) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +32
Analisis masalah:
Menurut pengamatan saya, dll yang dihasilkan langsung oleh aplikasi asp.net dapat dimuat secara normal, dan dll eksternal yang langsung dipanggil oleh asp.net juga dapat dimuat secara normal, tetapi dll eksternal lainnya yang hanya direferensikan oleh dll eksternal tidak dapat dimuat. sarat. Dugaan saya adalah: Karena izin tidak lengkap, DLL yang dihasilkan oleh aplikasi asp.net itu sendiri dan DLL yang direferensikan secara langsung dapat memperoleh izin melalui pewarisan izin, sedangkan DLL eksternal lain yang hanya direferensikan oleh DLL eksternal tidak dapat mewarisi izin karena pembatasan izin. jadi ada masalah izin yang tidak mencukupi.
Pemecahan masalah:
Melalui percobaan di komputer saya, berspekulasi bahwa pengaturan root web.config (di komputer saya lokasinya adalah C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG) telah dimodifikasi di virtual host.
Bagian pengaturan izin web.config default adalah sebagai berikut:
<lokasi memungkinkanOverride="benar">
<sistem.web>
<kebijakan keamanan>
<trustLevel name="Lengkap" policyFile="internal" />
<trustLevel name="Tinggi" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Rendah" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</kebijakan keamanan>
<tingkat kepercayaan="Penuh" originUrl="" />
</sistem.web>
</lokasi>
Agaknya pengaturan yang diubah pada host virtual: <locationallowOverride="false">
<sistem.web>
<kebijakan keamanan>
<trustLevel name="Lengkap" policyFile="internal" />
<trustLevel name="Tinggi" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Rendah" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config" />
</kebijakan keamanan>
<tingkat kepercayaan="Tinggi" originUrl="" />
</sistem.web>
</location> Dia terlebih dahulu menyetelallowOverride ke false, yang mencegah kemampuan untuk mendefinisikan ulang izin di web.config pengguna. Kemudian, dia menetapkan tingkat kepercayaan sebagai Tinggi, bukan Penuh default. Setelah pengujian saya, selama tingkat kepercayaan tidak Penuh, dll eksternal lainnya yang hanya direferensikan oleh dll eksternal tidak dapat dimuat. Oleh karena itu, saya menyarankan agar dukungan teknis menyetel bagianallowOverride ke true. Dengan cara ini saya dapat menentukan ulang izin di web.config.
Contoh: <trust level="Full" originUrl="" />
Saya belum mempelajari aps.net akhir-akhir ini, jadi saya belum mencari alasan yang mendasarinya dengan cermat. Saya harap ahlinya dapat memberi tahu saya alasan yang mendasarinya atau memperbaiki kesalahan saya.