如果你正在開發一個通用型的Web產品比如BBSCMSBLOG這類的那麼建議你閱讀以下本篇文章
非通用型的Web程序或產品通常不會和ASPNET中等安全模式打交道因為面對的用戶群體會比較固定或者部署環境是可以由程序提供者決定的
但在做通用型的Web產品的時候你就要和各種人打交道了有的站長用的是國外空間比如GoDaddy外國的空間商通常會把ASPNET代碼執行權限控制在中等安全模式
而在中等安全模式下很多我們習以為常的事情都是做不了的
中等安全模式是什麼?
可能很多人都沒接觸過中等安全模式我在參與bbsmax項目之前我也不知道有中等安全模式這麼個東西
簡單來說ASPNET提供了一個簡單設置代碼執行權限的方案叫做信任級別
它默認提供種信任級別分別是FullTrustHighMediumLowMinimal
每個信任級別的設置分別對應於一組代碼權限設置
這個方案讓網站部署者可以通過nfig快速設置網站的托管代碼執行權限
通過對nfig的<systemweb>/<trust>節點的level屬性值進行設置就可以將ASPNET程序設置到不同的信任級別
ASPNET安裝完所有網站默認都是FullTrust信任級別也是最高信任級別
本文說的中等安全模式就是對應於Medium信任級別
因為托管代碼執行權限模型不是本文討論的重點所以我這裡只做簡單的說明不深入討論ASPNET安全級別設置的實現原理實現原理可以參考本文最後給出的幾個連接
中等安全模式會有哪些影響?
以下是我和我的同事在ASPNET中等安全模式下曾經遇到過的一些問題
基於VirtualPathProvider的模板機制不能用因為VirtualPathProvider至少需要運行在High模式
BuildProvider不能用意味著你想自己添加自己的語言實現也不能用了不過大部分項目不會用到這麼高級的東西
CodeDomEmit不能用了這下慘了什麼IocAOP動態注入的高科技玩意兒全都廢了這些不是基於CodeDom的就是基於Emit的
通過aspx頁面接管文件下載也不行了Response寫文件流到客戶端需要更高的代碼執行權限
大文件上傳也別想了因為大文件上傳萬變不離HttpWorkRequst獲取HttpWorkRequst的代碼需要FullTrust模式
SQLite不能用了因為中等安全模式下沒有非托管代碼調用權限所以除了SQLite外涉及到非托管代碼調用的也都廢掉了
Access數據不能用OleDb連接了因為中等安全模式下OleDbClient是不能用的你只能用ODBC數據源
所以如果要考慮允許讓用戶把程序部署到中等安全模式下那就越早做中等安全模式的兼容性測試越好
因為很多不能用的東西都是涉及到基礎結構的
比如SQLite和Access不能用你的程序如果正巧就只做這兩個數據庫的版本咋辦?
比如文件下載不能通過Response寫文件流的方式你的程序正巧又是這麼做防盜鏈咋辦?
中等安全模式要求那麼苛刻怎麼對付?
只能繞道走了要不然怎麼辦?方法還是有的得不斷嘗試
VirtualPathProvider不能用BuildProvider也不能用但是又需要有自己的一套模板語法那只好在頁面訪問前生成aspx頁面再做URL重寫了
說起來很簡單就一句話但是這中間我不知道寫了多少代碼做了多少次試驗才找到最佳方案
所以你的方法還是得你自己找
以下是判斷程序是否運行在中等安全模式的代碼
if (SecurityManagerIsGranted(new AspNetHostingPermission(AspNetHostingPermissionLevelMedium)))
{
}
如果有遇到不是必須執行的邏輯比如獲取程序內存占用率或者大文件上傳那就可以先判斷下再決定是否調用
根據資料顯示把程序集部署到GAC中可以獲得FullTrust級別的權限不過我沒有實際試過
From:http://tw.wingwit.com/Article/program/net/201311/11948.html