首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

伺服器安全狗導致 ASP.NET 網站「RegistryPermission」字典鍵重複錯誤排查案例

     編輯:ASP.NET 基礎

部署 ASP.NET 網站至安裝「安全狗」的伺服器時,可能遇到啟動即拋出 System.ArgumentException: 項目已經存在。字典中的關鍵字: “RegistryPermission” 錯誤。本文記錄真實排查過程與解決方案。

錯誤堆疊追蹤

[ArgumentException: 已添加項。字典中的關鍵字:“RegistryPermission”所添加的關鍵字:“RegistryPermission”]
System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) +7482408
System.Security.Policy.PolicyLevel.FromXml(SecurityElement e) +307
System.Web.HttpRuntime.CreatePolicyLevel(String configFile, String appDir, String binDir, String strOriginUrl, Boolean& foundGacToken) +420
System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags) +186

排查過程

  1. 初步懷疑權限不足、DLL 遺失或版本衝突,檢查 bin 目錄、web.config 權限設定均正常
  2. 發現伺服器安裝「安全狗」防護軟體,且有 .NET 專用防護面板
  3. 安全狗預設將 .NET 程式碼存取 (CAS) 原則設為嚴格模式,導致運行時載入安全策略時重複註冊 RegistryPermission

解決方案

在安全狗管理主控台 → .NET 防護設定 → 將「權限控制模式」從「嚴格/自訂」改為 「完整模式」 (或「系統預設級別」),即不限制 .NET 程式碼存取權限:

安全狗 .NET 設定面板

原理說明

  • ASP.NET 執行階段啟動時會呼叫 HttpRuntime.HostingInit 建立程式碼存取安全策略 (PolicyLevel)
  • 安全狗透過 Hook 修改 CAS 原則,若設定不當會導致 PolicyLevel.FromXml 解析時重複插入相同權限類別
  • 完整模式繞過安全狗的 CAS 干預,還原 .NET 原生行為

替代方案 (不修改安全狗設定)

  • 在 web.config 設定 `` 強制完全信任 (需主機支援)
  • 將網站移至未安裝安全狗的伺服器
  • 聯繫安全狗廠商技術支援調整規則白名單

此案例提醒:生產環境安裝主機防護軟體時,務必驗證 .NET 應用程式相容性,並保留回滾方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved