ASP.NET中等安全模式的一些經(jīng)驗(yàn)分享
但在做通用型的Web產(chǎn)品的時(shí)候,你就要和各種人打交道了,有的站長(zhǎng)用的是國(guó)外空間,比如GoDaddy,外國(guó)的空間商通常會(huì)把ASP.NET代碼執(zhí)行權(quán)限控制在中等安全模式。
而在中等安全模式下,很多我們習(xí)以為常的事情都是做不了的。
中等安全模式是什么?
可能很多人都沒(méi)接觸過(guò)中等安全模式,我在參與bbsmax項(xiàng)目之前,我也不知道有中等安全模式這么個(gè)東西。
簡(jiǎn)單來(lái)說(shuō),ASP.NET提供了一個(gè)簡(jiǎn)單設(shè)置代碼執(zhí)行權(quán)限的方案,叫做“信任級(jí)別”。
它默認(rèn)提供5種信任級(jí)別,分別是:FullTrust、High、Medium、Low、Minimal。
每個(gè)信任級(jí)別的設(shè)置,分別對(duì)應(yīng)于一組代碼權(quán)限設(shè)置。
這個(gè)方案,讓網(wǎng)站部署者可以通過(guò)web.config快速設(shè)置網(wǎng)站的托管代碼執(zhí)行權(quán)限。
通過(guò)對(duì)web.config的<system.web>/<trust>節(jié)點(diǎn)的level屬性值進(jìn)行設(shè)置,就可以將ASP.NET程序設(shè)置到不同的信任級(jí)別。
ASP.NET安裝完,所有網(wǎng)站默認(rèn)都是FullTrust信任級(jí)別,也是最高信任級(jí)別。
本文說(shuō)的“中等安全模式”就是對(duì)應(yīng)于Medium信任級(jí)別。
因?yàn)橥泄艽a執(zhí)行權(quán)限模型不是本文討論的重點(diǎn),所以我這里只做簡(jiǎn)單的說(shuō)明,不深入討論ASP.NET安全級(jí)別設(shè)置的實(shí)現(xiàn)原理,實(shí)現(xiàn)原理可以參考本文最后給出的幾個(gè)連接。
中等安全模式會(huì)有哪些影響?
以下是我和我的同事在ASP.NET中等安全模式下曾經(jīng)遇到過(guò)的一些問(wèn)題:
1. 基于VirtualPathProvider的模板機(jī)制不能用,因?yàn)閂irtualPathProvider至少需要運(yùn)行在High模式。
2. BuildProvider不能用,意味著你想自己添加自己的語(yǔ)言實(shí)現(xiàn)也不能用了,不過(guò)大部分項(xiàng)目不會(huì)用到這么高級(jí)的東西。
3. CodeDom、Emit不能用了,這下慘了,什么Ioc、AOP,動(dòng)態(tài)注入的高科技玩意兒,全都廢了,這些不是基于CodeDom的就是基于Emit的。
4. 通過(guò)aspx頁(yè)面接管文件下載也不行了,Response寫(xiě)文件流到客戶(hù)端需要更高的代碼執(zhí)行權(quán)限。
5. 大文件上傳也別想了,因?yàn)榇笪募蟼魅f(wàn)變不離HttpWorkRequst,獲取HttpWorkRequst的代碼需要FullTrust模式。
6. SQLite不能用了,因?yàn)橹械劝踩J较聸](méi)有非托管代碼調(diào)用權(quán)限,所以除了SQLite外,涉及到非托管代碼調(diào)用的,也都廢掉了。
7. Access數(shù)據(jù)不能用OleDb連接了,因?yàn)橹械劝踩J较?,OleDbClient是不能用的,你只能用ODBC數(shù)據(jù)源。
所以,如果要考慮允許讓用戶(hù)把程序部署到中等安全模式下,那就越早做中等安全模式的兼容性測(cè)試越好。
因?yàn)楹芏嗖荒苡玫臇|西,都是涉及到基礎(chǔ)結(jié)構(gòu)的。
比如,SQLite和Access不能用,你的程序如果正巧就只做這兩個(gè)數(shù)據(jù)庫(kù)的版本,咋辦?
比如,文件下載不能通過(guò)Response寫(xiě)文件流的方式,你的程序正巧又是這么做防盜鏈,咋辦?
中等安全模式要求那么苛刻,怎么對(duì)付?
只能繞道走了,要不然怎么辦?方法還是有的,得不斷嘗試。
VirtualPathProvider不能用,BuildProvider也不能用,但是又需要有自己的一套模板語(yǔ)法。那只好在頁(yè)面訪問(wèn)前生成aspx頁(yè)面,再做URL重寫(xiě)了。
說(shuō)起來(lái)很簡(jiǎn)單,就一句話。但是這中間我不知道寫(xiě)了多少代碼,做了多少次試驗(yàn),才找到最佳方案。
所以,你的方法還是得你自己找。
以下是判斷程序是否運(yùn)行在中等安全模式的代碼:
if (SecurityManager.IsGranted(new AspNetHostingPermission(AspNetHostingPermissionLevel.Medium)))
{
}
如果有遇到不是必須執(zhí)行的邏輯,比如獲取程序內(nèi)存占用率或者大文件上傳,那就可以先判斷下,再?zèng)Q定是否調(diào)用。
根據(jù)資料顯示,把程序集部署到GAC中,可以獲得FullTrust級(jí)別的權(quán)限,不過(guò)我沒(méi)有實(shí)際試過(guò)。
附錄A
參考鏈接:
MSDN 《trust 元素(ASP.NET 設(shè)置架構(gòu))》
MSDN 《How To: Use Medium Trust in ASP.NET 2.0》
《Check Code Access Security Permissions Granted to your asp.net web application》
附錄B
辰 提供的文件下載方案:
protected override void OnInit(EventArgs e)
{
Response.ContentType = "application/octet-stream";
using (FileStream stream = File.Open(Server.MapPath("~/test.txt"), FileMode.Open))
{
BinaryWriter writer = new BinaryWriter(Response.OutputStream);
byte[] buffer = new byte[1024];
int l = 0;
while ((l = stream.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, l);
}
}
}
相關(guān)文章
GridView_RowUpdating取不到新值的解決方法
GridView_RowUpdating取不到新值的解決方法,需要的朋友可以參考一下2013-05-05asp.net Repeater綁定時(shí)使用函數(shù)
asp.net repeater綁定函數(shù)使用實(shí)例2008-08-08ASP.NET如何定時(shí)調(diào)用WebService服務(wù)
在ASP.NET程序中,可以通過(guò)Time組件實(shí)現(xiàn)定時(shí)器功能,但是它與數(shù)據(jù)庫(kù)中的任務(wù)計(jì)劃不一樣,它必須基于程序正在運(yùn)行中才可生效,而數(shù)據(jù)庫(kù)任務(wù)計(jì)劃是不需要基于ASP.NET程序運(yùn)行而執(zhí)行任務(wù)。2015-10-10.Net連接Oracle數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
本文使用System.Data.OracleClient方式,這是MS提供的以ADO.NET方式訪問(wèn)Oracel的驅(qū)動(dòng);Oracle也有個(gè)Oracle Data Provider for .NET(ODP.NET)下篇再討論。2009-02-02.NET中如何將文本文件的內(nèi)容存儲(chǔ)到DataSet
大家在項(xiàng)目中比較多的會(huì)對(duì)文件進(jìn)行操作,例如文件的上傳下載,文件的壓縮和解壓等IO操作。而在.NET項(xiàng)目中較多的會(huì)使用DataSet,DataTable進(jìn)行數(shù)據(jù)的緩存。每一個(gè)DataSet都是一個(gè)或多個(gè)DataTable對(duì)象的集合,本文主要介紹的是如何將文本文件的內(nèi)容存儲(chǔ)到DataSet里去。2016-12-12asp.net微信開(kāi)發(fā)(自定義會(huì)話管理)
這篇文章主要介紹了asp.net微信開(kāi)發(fā)中有關(guān)自定義會(huì)話管理的相關(guān)內(nèi)容,需要的朋友可以參考下2015-11-11在Repeater控件中通過(guò)Eval的方式綁定Style樣式代碼
這篇文章主要介紹了如何在Repeater控件中通過(guò)Eval的方式綁定Style樣式,需要的朋友可以參考下2014-04-04