顯示具有 部分信任 標籤的文章。 顯示所有文章
顯示具有 部分信任 標籤的文章。 顯示所有文章

2026年1月23日 星期五

[研究]GCB,IIS,ASP.NET設定建議,.NET信任層級(trust leve)實測(二)

[研究]GCB,IIS,ASP.NET設定建議,.NET信任層級(trust leve)實測(二)

2025-01-21

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 20.2

********************************************************************************

[研究]GCB,IIS,ASP.NET設定建議,.NET信任層級(trust leve)實測(一)
https://shaurong.blogspot.com/2026/01/gcbiisaspnetnettrust-leve.html

上次是 ASP.NET 網頁,這次改用只有 .html 網頁

程式只有顯示 test 字串,沒別的。

Default.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
Test
</body>
</html>


********************************************************************************

Deploy 到網站後,先測試網站正常


下圖,


下圖,這次別說從 Full 改設為 High,再嚴格到 Medium,也正常顯示,因為 .html 網頁不會用到 .NET Framework

2026年1月22日 星期四

[研究]GCB,IIS,ASP.NET設定建議,.NET信任層級(trust leve)實測(一)

[研究]GCB,IIS,ASP.NET設定建議,.NET信任層級(trust leve)實測(一)

2025-01-21

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 20.2

********************************************************************************

發現ASP.NET WebForm 預設建立的方案,使用 .NET Framework 4.8


程式只有顯示 test 字串,沒別的。

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
    Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        test
    </form>
</body>
</html>

Default.aspx.cs

using System;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

********************************************************************************

Deploy 到網站後,先測試網站正常


下圖,把預設值 Full 改為 High

下圖,測試

錯誤訊息

'/' 應用程式中發生伺服器錯誤。
安全性例外狀況
描述: 應用程式嘗試執行安全原則不允許的作業。如果要授與這個應用程式所需的權限,請聯繫您的系統管理員,或在組態檔中變更這個應用程式的信任層級。

例外狀況詳細資訊: System.Security.SecurityException: 要求已經失敗。

原始程式錯誤:

在執行目前 Web 要求期間,產生未處理的例外狀況。如需有關例外狀況來源與位置的資訊,可以使用下列的例外狀況堆疊追蹤取得。

堆疊追蹤:


[SecurityException: 要求已經失敗。]
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +96
   System.Type.GetType(String typeName) +62
   System.CodeDom.Compiler.CompilerInfo.get_IsCodeDomProviderTypeValid() +15
   System.Web.Compilation.CompilationUtil.GetRecompilationHash(CompilationSection ps) +2406
   System.Web.Configuration.CompilationSection.get_RecompilationHash() +110
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDateInternal(Int64 cachedHash) +551
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDate(Int64 cachedHash) +59
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +155
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +746

版本資訊: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.8.4797.0

********************************************************************************

ASP.NET WebForm,System.Security.Permissions.ReflectionPermission 是甚麼 ?

System.Security.Permissions.ReflectionPermission 不是第三方套件,而是:

  • 👉 .NET Framework 內建的類別
  • 👉 隸屬於 程式碼存取安全性(Code Access Security, CAS) 架構

📦 所屬 Assembly(組件):mscorlib.dll

也就是說:

  • 不需要安裝 NuGet
  • 不需要額外引用 DLL
  • 只要是 .NET Framework(非 .NET Core / .NET 5+) 都一定存在

********************************************************************************
CAS被微軟棄用,建議設定Full,否則很多程式庫不能用。但微軟對 .NET 4.0 開始宣導使用 Full Trust。

Code Access Security
Because Code Access Security is deprecated, most modern code within the .NET ecosystem is not designed to operate within a partial trust environment. Applications that rely on CAS should not expect modern libraries to behave correctly within these environments, unless the library developer has taken explicit steps to ensure compatibility within the CAS sandbox.
由於程式碼存取安全性 (CAS) 已被棄用,.NET 生態系統中的大多數現代程式碼並非設計用於在部分信任環境中運作。依賴 CAS 的應用程式不應期望現代函式庫在這些環境中正常運行,除非函式庫開發者已採取明確措施確保其與 CAS 沙箱的兼容性。

********************************************************************************


看來以 ASP.NET WebForm 專案而言,其使用的 .NET Framerwork 的 .NET信任層級(trust leve) 必須 Full Trust。(除非你在 IIS 上不要架設 ASP.NET 網站,例如改用 PHP 或其他)

(完)

相關

.NET Framework 生命週期
https://learn.microsoft.com/zh-tw/lifecycle/products/microsoft-net-framework

[研究]ASP.NET trust level、部分信任 (Partial Trust)、程式碼存取安全性 (Code Access Security, CAS)、.NET信任層級

[研究]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 權限集。

也就是說:


ASP.NET Trust Level → 對應 .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

(完)