当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET中等安全模式的一些经验分享

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

ASP.NET中等安全模式的一些经验分享


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-20   浏览: 49 ::
收藏到网摘: n/a

如果你正在开发一个通用型的Web产品,比如BBS、CMS、BLOG这类的,那么,建议你阅读以下本篇文章。 非通用型的Web程序或产品,通常不会和ASP.NET中等安全模式打交道,因为面对的用户群体会比较固定,或者部署环境是可以由程序提供者决定的。
但在做通用型的Web产品的时候,你就要和各种人打交道了,有的站长用的是国外空间,比如GoDaddy,外国的空间商通常会把ASP.NET代码执行权限控制在中等安全模式。
而在中等安全模式下,很多我们习以为常的事情都是做不了的。
中等安全模式是什么?
可能很多人都没接触过中等安全模式,我在参与bbsmax项目之前,我也不知道有中等安全模式这么个东西。
简单来说,ASP.NET提供了一个简单设置代码执行权限的方案,叫做“信任级别”。
它默认提供5种信任级别,分别是:FullTrust、High、Medium、Low、Minimal。
每个信任级别的设置,分别对应于一组代码权限设置。
这个方案,让网站部署者可以通过web.config快速设置网站的托管代码执行权限。
通过对web.config的<system.web>/<trust>节点的level属性值进行设置,就可以将ASP.NET程序设置到不同的信任级别。
ASP.NET安装完,所有网站默认都是FullTrust信任级别,也是最高信任级别。
本文说的“中等安全模式”就是对应于Medium信任级别。
因为托管代码执行权限模型不是本文讨论的重点,所以我这里只做简单的说明,不深入讨论ASP.NET安全级别设置的实现原理,实现原理可以参考本文最后给出的几个连接。
中等安全模式会有哪些影响?
以下是我和我的同事在ASP.NET中等安全模式下曾经遇到过的一些问题:
1. 基于VirtualPathProvider的模板机制不能用,因为VirtualPathProvider至少需要运行在High模式。
2. BuildProvider不能用,意味着你想自己添加自己的语言实现也不能用了,不过大部分项目不会用到这么高级的东西。
3. CodeDom、Emit不能用了,这下惨了,什么Ioc、AOP,动态注入的高科技玩意儿,全都废了,这些不是基于CodeDom的就是基于Emit的。
4. 通过aspx页面接管文件下载也不行了,Response写文件流到客户端需要更高的代码执行权限。
5. 大文件上传也别想了,因为大文件上传万变不离HttpWorkRequst,获取HttpWorkRequst的代码需要FullTrust模式。
6. SQLite不能用了,因为中等安全模式下没有非托管代码调用权限,所以除了SQLite外,涉及到非托管代码调用的,也都废掉了。
7. Access数据不能用OleDb连接了,因为中等安全模式下,OleDbClient是不能用的,你只能用ODBC数据源。
所以,如果要考虑允许让用户把程序部署到中等安全模式下,那就越早做中等安全模式的兼容性测试越好。
因为很多不能用的东西,都是涉及到基础结构的。
比如,SQLite和Access不能用,你的程序如果正巧就只做这两个数据库的版本,咋办?
比如,文件下载不能通过Response写文件流的方式,你的程序正巧又是这么做防盗链,咋办?
中等安全模式要求那么苛刻,怎么对付?
只能绕道走了,要不然怎么办?方法还是有的,得不断尝试。
VirtualPathProvider不能用,BuildProvider也不能用,但是又需要有自己的一套模板语法。那只好在页面访问前生成aspx页面,再做URL重写了。
说起来很简单,就一句话。但是这中间我不知道写了多少代码,做了多少次试验,才找到最佳方案。
所以,你的方法还是得你自己找。
以下是判断程序是否运行在中等安全模式的代码:
复制代码 代码如下:

if (SecurityManager.IsGranted(new AspNetHostingPermission(AspNetHostingPermissionLevel.Medium)))
{
}

如果有遇到不是必须执行的逻辑,比如获取程序内存占用率或者大文件上传,那就可以先判断下,再决定是否调用。
根据资料显示,把程序集部署到GAC中,可以获得FullTrust级别的权限,不过我没有实际试过。

附录A

参考链接:

MSDN 《trust 元素(ASP.NET 设置架构)》

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);
}
}
}