[研究]ASP.NET trust level、部分信任 (Partial Trust)、程式碼存取安全性 (Code Access Security, CAS)、.NET信任層級
2026-01-22
以下用 ASP.NET 的實務脈絡,把 Trust Level、部分信任(Partial Trust)、CAS(Code Access Security) 的關係一次講清楚,也會點出 哪些是歷史機制、哪些在新版本已經名存實亡。
一句話先講結論
ASP.NET Trust Level 是「套用在 Web App 上的一組 CAS 權限集合」
- Partial Trust:靠 CAS 限制程式能做什麼
- Full Trust:幾乎不套用 CAS 限制
- .NET 4.5+ / ASP.NET 4.6+:CAS 對 Web App 幾乎已廢棄
一、名詞各自是什麼?
1️⃣ Code Access Security(CAS)
最底層的安全模型(.NET Framework 傳統機制)
- 目的:限制 程式碼「能做什麼」
- 判斷依據:
- 程式碼來源(URL、Strong Name、Zone)
- 授與對應的 Permission
- 常見 Permission:
- FileIOPermission
- SecurityPermission
- ReflectionPermission
- WebPermission
📌 重點
CAS 是一套「在 CLR 層級執行的安全沙盒」
2️⃣ Partial Trust(部分信任)
CAS 的一種實際使用模式
- 表示:
- 程式 不是 Full Trust
- 只能使用 被授權的 CAS Permissions
- 典型使用場景(過去):
- Shared Hosting
- 多租戶 IIS
- 不信任的第三方元件
📌 Partial Trust ≠ ASP.NET 專屬
它是 CAS 的一種狀態
3️⃣ ASP.NET Trust Level
ASP.NET 對 CAS 的「封裝設定」
- 用來決定:
- 這個 Web Application 跑在 哪一組 CAS 權限集合
- 設定方式:
<trust level="Medium" />
|
📌 Trust Level 不是新的安全模型
它只是 把 CAS PermissionSet 包成好用的名稱
4️⃣ .NET 信任層級 (Framework Trust Level)
定義:.NET 框架本身支援 信任層級 的概念,用來定義程式碼可以執行的權限範圍。
與 ASP.NET 的對應:
ASP.NET 透過 <trust> 將 ASP.NET 層級的設定,轉換為 .NET CAS 權限集。
也就是說:
|
實務注意:
- 在 Full Trust 下,CAS 幾乎不會限制應用程式。
- 在 Medium / Low Trust 下,CAS 會阻擋部分 API,如 Reflection、IO 操作等。
二、ASP.NET Trust Level 與 CAS 的對應關係
| ASP.NET Trust Level | 本質 | 使用的安全模型 |
|---|---|---|
| Full | 無限制 | 幾乎不使用 CAS |
| High | 少量限制 | CAS |
| Medium | 明顯限制 | CAS |
| Low | 極度限制 | CAS |
| Minimal | 幾乎不能用 | CAS |
👉 Trust Level = 預先定義好的 CAS PermissionSet
三、實際例子(Partial Trust 下會發生什麼)
🚫 在 High Trust 常見會失敗的事情
🚫 在 Medium Trust 常見會失敗的事情
範例:
File.ReadAllText(@"C:\test.txt"); // ❌ FileIOPermission |
範例:
Assembly.LoadFrom("xxx.dll"); // ❌ Reflection / Load 權限
|
範例:
Environment.Exit(0); // ❌ SecurityPermission |
範例:
[DllImport("user32.dll")]
static extern int MessageBox(...); // ❌ UnmanagedCode
|
📌 這些錯誤都是 CAS 在擋,不是 IIS 在擋
四、ASP.NET Trust Level 設定在哪?
Web.config
<system.web> <trust level="Medium" originUrl="" /> </system.web> |
Machine.config(全機器)
<trust level="Full" /> |
五、重要歷史轉折(一定要知道)
🔥 .NET 4 之後的重大變化
| 時期 | 狀況 |
|---|---|
| .NET 2.0–3.5 | CAS 是主流 |
| .NET 4.0 | CAS 預設 關閉多數 Policy |
| .NET 4.5+ | ASP.NET Partial Trust 幾乎不再支援 |
| ASP.NET Core | ❌ 完全沒有 CAS |
📌 Microsoft 官方立場
不再建議使用 CAS / Partial Trust
改用 OS / IIS / Container / Account-based Security
六、現代 ASP.NET 實務建議(重點)
❌ 不要再依賴
- Partial Trust
- Medium / Low Trust
- CAS Permission
✅ 改用
| 層級 | 作法 |
|---|---|
| OS | 低權限 App Pool Identity |
| IIS | Request Filtering / Handler |
| 檔案 | NTFS ACL |
| 程式 | Sandbox Process / Container |
| 架構 | Microservice / API 隔離 |
七、三者關係圖(文字版)
ASP.NET Trust Level
↓
CAS PermissionSet
↓
Partial Trust / Full Trust
↓
CLR 在 Runtime 阻擋或放行
|
八、快速總結表
| 名詞 | 本質 |
|---|---|
| CAS | .NET Framework 的程式碼權限系統 |
| Partial Trust | 使用 CAS 限制程式能力 |
| ASP.NET Trust Level | ASP.NET 封裝的 CAS 設定組 |
********************************************************************************
在 High Trust 常見會失敗的事情 ?
一、High Trust 與 Full Trust 的核心差異
| 能力 | High Trust | Full Trust |
|---|---|---|
| CAS 啟用 | ✅ 有 | ❌ 幾乎無 |
| Unmanaged Code | ❌ | ✅ |
| 任意反射 | ❌(有限) | ✅ |
| 任意檔案 IO | ⚠️(有限) | ✅ |
| 操作系統層級 | ❌ | ✅ |
二、High Trust 下「常見會失敗」的事情(重點)
1️⃣ 呼叫 Unmanaged Code(最常見)
[DllImport("user32.dll")]
static extern int MessageBox(IntPtr hWnd, string text, string caption, int type);
|
📛 結果
SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission' failed. |
📌 原因
- High Trust 不包含 UnmanagedCode 權限
- 所有 P/Invoke 都會失敗
2️⃣ 載入「未完全信任」的 Assembly
Assembly.LoadFrom(@"C:\temp\plugin.dll"); |
📛 可能錯誤
SecurityException: Request for ReflectionPermission failed
|
📌 原因
- High Trust 仍限制:
- 動態載入來源不明 DLL
- 非 Strong Name Assembly
3️⃣ 反射存取 Non-Public 成員
typeof(MyClass)
.GetField("_secret", BindingFlags.NonPublic | BindingFlags.Instance);
|
📛 原因
- High Trust 僅允許 受限反射
- 不允許任意存取 private / internal 成員
4️⃣ 嘗試提升權限(Assert / Demand)
new FileIOPermission(PermissionState.Unrestricted).Assert();
|
📛 結果
SecurityException
|
📌 原因
- High Trust 不能提升自身權限
- CAS 只允許向下使用,不允許自行放大
5️⃣ 操作其他 AppDomain / Process
Process.Start("cmd.exe");
|
📛 原因
- 需要 SecurityPermission(ControlAppDomain / UnmanagedCode)
- High Trust 不允許
6️⃣ 讀寫不在允許範圍內的檔案
File.WriteAllText(@"C:\Windows\test.txt", "x");
|
📛 結果
SecurityException: FileIOPermission
|
📌 說明
- High Trust 通常只允許
- App Root
- 特定 temp / data 目錄
- 不包含系統目錄
7️⃣ 使用需要 Full Trust 的第三方套件
📛 常見套件類型:
- PDF / Office COM Interop
- Image 處理(GDI+ 深度操作)
- 系統層級監控
- 舊版報表元件
📌 症狀
- 在本機正常
- 部署到 High Trust Host 就爆炸
三、High Trust「看似可以,其實有坑」的事情
✔ 有時可用(取決於實作)
- Reflection(public only)
- 部分 Environment 資訊
- 網路存取(HTTP / HTTPS)
❌ 絕對不行
- P/Invoke
- COM Interop
- Registry 任意存取
- 操作 Windows Service
四、為什麼還會有 High Trust?
👉 歷史原因
- Shared Hosting
- 一台 IIS 跑多個客戶
- Host 想保護 OS
- 但 現代已不建議使用
五、實務建議(非常重要)
如果你現在遇到「High Trust 才會出錯」
請直接假設:
你需要 Full Trust
然後改用:
| 方案 | 說明 |
|---|---|
| Full Trust App Pool | 最直接 |
| 低權限帳號 + Full Trust | 比 CAS 安全 |
| Container / VM | 真正隔離 |
| API 外掛 | 把危險操作拆出去 |
六、快速對照表
| 行為 | High Trust |
|---|---|
| File IO(App 資料夾) | ✅ |
| HTTP 存取 | ✅ |
| Reflection(public) | ✅ |
| Reflection(private) | ❌ |
| P/Invoke | ❌ |
| COM | ❌ |
| Process.Start | ❌ |
| Registry | ❌ |
(完)
沒有留言:
張貼留言