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

.NET技术    2010-01-20 00:13  

  要是你正在开辟一个通用型的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);
        }
    }
}

在线留言

我要留言