早期 Visual Studio 版本幾乎不涉及程式碼層面的安全控制,一切仰賴作業系統權限。.NET Framework 引入 程式碼存取安全性,根據程式碼來源(區域)、強名稱、發布者憑證、URL 等證據,授予精細權限集合。這意味著:相同使用者、相同程式碼,放在本機硬碟與網路共享執行,權限可能截然不同。開發者必須預期權限不足導致的例外,並在程式碼中妥善處理。
| 區域 | 來源 | 預設信任 |
|---|---|---|
| 我的電腦 | 本機硬碟 | 完全信任 |
| 區域內部網路 | Intranet 共享資料夾 | 中度信任 |
| 網際網路 | 網路下載 | 低度信任 |
| 信任的網站 | IE 信任站點區域 | 中度信任 |
| 不信任的網站 | IE 受限站點區域 | 不信任 |
系統管理員可透過「管理工具」調整各區域權限。你無法控制用戶端的安全設定,只能在程式碼中優雅地應對權限拒絕。
// C#
public void SaveBitmap()
{
Bitmap b = null;
try
{
b = new Bitmap(100, 100);
b.Save(@"c:\PrettyPicture.bmp");
}
catch (System.Security.SecurityException)
{
MessageBox.Show("權限不足,無法儲存圖片。");
}
catch (Exception ex)
{
MessageBox.Show("其他錯誤:" + ex.Message);
}
}
關鍵點:先捕獲 SecurityException,再捕獲通用 Exception,區分「安全性拒絕」與「一般 I/O 錯誤」,給使用者明確回饋。
在組件層級宣告最低權限需求,載入時即由 CLR 驗證,不足則拒絕載入並拋出例外:
[assembly: FileIOPermission(SecurityAction.RequestMinimum, Write = @"c:\PrettyPicture.bmp")]
適用於類別庫,主程式需包裝 try/catch 處理載入失敗。
在程式碼中動態檢查權限:
string path = @"c:\PrettyPicture.bmp";
FileIOPermission perm = new FileIOPermission(FileIOPermissionAccess.Write, path);
try
{
perm.Demand(); // 若無權限拋出 SecurityException
bmp.Save(path);
}
catch (SecurityException) { /* 處理 */ }
優點:可在執行前預檢,決定是否執行替代邏輯(如存至隔離存儲、記憶體串流)。
當檔案系統權限不足時,System.IO.IsolatedStorage 提供每組件/使用者/網域獨立的虛擬檔案系統,**無需額外權限即可讀寫**。
using (var store = IsolatedStorageFile.GetUserStoreForAssembly())
using (var stream = new IsolatedStorageFileStream("data.dat", FileMode.Create, store))
using (var writer = new BinaryWriter(stream))
{
writer.Write(bmpBytes);
}
caspol.exe 建立自訂程式碼群組,指定低權限集合SecurityException 驗證捕獲邏輯caspol.exe(權限配置)、sn.exe(強名稱)、secutil.exe(安全工具)「權限不足」不是 Bug,而是 .NET 安全模型的正常行為。優秀的 .NET 開發者會:預期權限缺失、捕獲 SecurityException、提供降級方案(隔離存儲/記憶體/使用者提示)、在多區域測試驗證。下一篇將深入 Web 應用程式安全性、ASPNET 進程身分、動態發現、身分驗證與模擬機制。