如果你正在开发一个通用型的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级别的权限不过我没有实际试过