บางครั้งแอปพลิเคชัน asp.net ที่เราเขียนทำงานบนโฮสต์เสมือน โฮสต์เสมือนบางแห่งอาจตั้งค่าการอนุญาตบน asp.net เนื่องจากข้อพิจารณาด้านความปลอดภัย ซึ่งจะทำให้แอปพลิเคชันของเราทำงานไม่ถูกต้อง
อาการของปัญหา:
ด้วยเหตุผลบางประการ asp.net ไม่สามารถโหลดไฟล์ dll บางไฟล์ได้ และข้อความแสดงข้อผิดพลาดต่อไปนี้ปรากฏขึ้น: ข้อผิดพลาดของเซิร์ฟเวอร์ในแอปพลิเคชัน '/'
-------------------------------------------------
ไม่สามารถรับสิทธิ์ที่จำเป็นได้ .
คำอธิบาย: มีข้อยกเว้นที่ไม่สามารถจัดการได้เกิดขึ้นระหว่างการดำเนินการตามคำขอของเว็บปัจจุบัน โปรดตรวจสอบการติดตามสแต็กเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดและตำแหน่งที่เกิดในโค้ด ราย
ละเอียดข้อยกเว้น: System.Security.Policy.PolicyException: ไม่สามารถรับสิทธิ์ที่จำเป็นได้
ข้อ
ผิดพลาดแหล่งที่มา
:
มีการสร้างข้อยกเว้นที่ไม่สามารถจัดการได้ในระหว่างการดำเนินการคำขอเว็บปัจจุบัน ข้อมูลเกี่ยวกับที่มาและตำแหน่งของข้อยกเว้นสามารถระบุได้โดยใช้การติดตามสแต็กข้อยกเว้นด้านล่าง
[PolicyException: ไม่สามารถรับสิทธิ์ที่จำเป็นได้]
System.Security.SecurityManager.ResolvePolicy (หลักฐานหลักฐาน, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet & ปฏิเสธ, Boolean checkExecutionPermission) +2738293
System.Security.SecurityManager.ResolvePolicy (หลักฐานหลักฐาน PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet & ปฏิเสธ, Int32 & securitySpecialFlags, checkExecutionPermission บูลีน) +57
[FileLoadException: ไม่สามารถโหลดแฟ้มหรือแอสเซมบลี 'Microsoft.Practices.ObjectBuilder เวอร์ชัน = 1.0 .51205.0, Culture=neutral, PublicKeyToken=null' หรือการอ้างอิงอย่างใดอย่างหนึ่ง ไม่สามารถให้สิทธิ์ขั้นต่ำได้ (ยกเว้นจาก HRESULT: 0x80131417)]
System.Reflection.Assembly.nLoad (ชื่อไฟล์ AssemblyName, codeBase สตริง, หลักฐาน assemblySecurity, ตำแหน่งแอสเซมบลีคำแนะนำ, StackCrawlMark & stackMark, ThrowOnFileNotFound บูลีน, บูลีน forIntrospection) +0
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef หลักฐาน assemblySecurity, StackCrawlMark & stackMark, บูลีน forIntrospection) +211
System.Reflection.Assembly.InternalLoad (สตริ assemblyString หลักฐาน assemblySecurity, StackCrawlMark & stackMark, บูลีน forIntrospection) +141
System.Reflection.Assembly.Load (สตริงแอสเซมบลีสตริง) +25
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (สตริแอสเซมบลีชื่อ starDirective บูลีน) +32
การวิเคราะห์ปัญหา:
จากการสังเกตของฉัน dll ที่สร้างโดยตรงจากแอปพลิเคชัน asp.net สามารถโหลดได้ตามปกติ และ dll ภายนอกที่เรียกโดยตรงโดย asp.net ก็สามารถโหลดได้ตามปกติ แต่ dll ภายนอกอื่น ๆ ที่อ้างอิงโดย dll ภายนอกเท่านั้นไม่สามารถ โหลดแล้ว ฉันเดาว่า: เนื่องจากการอนุญาตไม่สมบูรณ์ DLL ที่สร้างโดยแอปพลิเคชัน asp.net และ DLL ที่อ้างอิงโดยตรงสามารถรับสิทธิ์ผ่านการสืบทอดสิทธิ์ ในขณะที่ DLL ภายนอกอื่น ๆ ที่อ้างอิงโดย DLL ภายนอกเท่านั้นไม่สามารถสืบทอดสิทธิ์ได้เนื่องจากข้อจำกัดของสิทธิ์ จึงเกิดปัญหาสิทธิ์ไม่เพียงพอ
การแก้ปัญหา:
จากการทดลองบนคอมพิวเตอร์ของฉัน มีการคาดเดาว่าการตั้งค่าของ root web.config (บนคอมพิวเตอร์ของฉัน ตำแหน่งคือ C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG) ได้รับการแก้ไขบนโฮสต์เสมือน
ส่วนการตั้งค่าสิทธิ์เริ่มต้นของ web.config จะเป็นดังนี้:
<สถานที่allowOverride="true">
<system.เว็บ>
<นโยบายความปลอดภัย>
<trustLevel name="Full" PolicyFile="internal" />
<trustLevel name="สูง" PolicyFile="web_hightrust.config" />
<trustLevel name="Medium" PolicyFile="web_mediumtrust.config" />
<trustLevel name="ต่ำ" PolicyFile="web_lowtrust.config" />
<trustLevel name="Minimal" PolicyFile="web_minimaltrust.config" />
</นโยบายความปลอดภัย>
<ระดับความน่าเชื่อถือ = "เต็ม" originUrl = "" />
</system.เว็บ>
</ตำแหน่ง>
น่าจะเป็นการตั้งค่าที่แก้ไขบนโฮสต์เสมือน: <location AllowOverride="false">
<system.เว็บ>
<นโยบายความปลอดภัย>
<trustLevel name="Full" PolicyFile="internal" />
<trustLevel name="สูง" PolicyFile="web_hightrust.config" />
<trustLevel name="Medium" PolicyFile="web_mediumtrust.config" />
<trustLevel name="ต่ำ" PolicyFile="web_lowtrust.config" />
<trustLevel name="Minimal" PolicyFile="web_minimaltrust.config" />
</นโยบายความปลอดภัย>
<ระดับความน่าเชื่อถือ = "สูง" originUrl = "" />
</system.เว็บ>
</location> ก่อนอื่นเขาตั้งค่า AllowOverride เป็นเท็จ ซึ่งจะป้องกันความสามารถในการกำหนดสิทธิ์ใหม่ใน web.config ของผู้ใช้ จากนั้น เขาได้กำหนดระดับความน่าเชื่อถือเป็นสูงแทนที่จะเป็นค่าเริ่มต้นเต็ม หลังจากการทดสอบของฉัน ตราบใดที่ระดับความน่าเชื่อถือไม่เต็ม dll ภายนอกอื่นๆ ที่อ้างอิงโดย dll ภายนอกเท่านั้นก็ไม่สามารถโหลดได้ ดังนั้น ฉันขอแนะนำให้ฝ่ายสนับสนุนด้านเทคนิคตั้งค่าส่วน AllowOverride ให้เป็นจริง วิธีนี้ฉันสามารถระบุการอนุญาตใน web.config ได้อีกครั้ง
ตัวอย่าง: <trust level="Full" originUrl="" />
ฉันยังไม่ได้ศึกษา aps.net เมื่อเร็วๆ นี้ ดังนั้นฉันจึงไม่ได้ดูสาเหตุที่แท้จริงอย่างละเอียด บางทีความเข้าใจของฉันอาจผิด ฉันหวังว่าผู้เชี่ยวชาญสามารถบอกเหตุผลที่ซ่อนอยู่หรือแก้ไขข้อผิดพลาดของฉันได้