David Qian

If there's a problem, just resolve it yourself

统计

ASP.NET 代码访问安全 (Code Access Security)
-

前两天我写了一篇关于ASP.NET程序权限的随笔,今天继续和大家讨论下代码访问安全。

代码访问安全(Code Access Security),顾名思义,是用来限制代码的。它能限制代码能否被执行,进而来限制ASP.NET程序能执行什么样的操作。比如CAS限制你不允许使用FileIOPermission,那么ASP.NET程序便不能进行IO操作。同样,如果限制你使用SqlClientPermission,ASP.NET程序便不能进行SQL Server的操作。

CAS默认定义了5个不同的level,它们是Full,High,Medium,Low 以及Minimal。从Full到Minimal,权限越来越低。基本上在Full level的时候什么都能做,Minimal level的时候只能执行最基本的mangered code。在我们的ASP.NET程序中,trust level是在根目录下的web.config中配置的,如:<trust level="Full"/>,如果你没有配置的话,默认为Full level。今天以一个host admin的角色讲讲怎样通过CAS来保护server。大概有如下几个步骤:

1) 明确server上ASP.NET程序需要进行什么样的操作。
2) 从预定义好的5个级别中选择一个最适合的级别。
3) 如果没有合适的,自己定义一个级别。
4) 定义级别不允许被覆盖。
5) 测试效果。

 

第一步:明确server上ASP.NET程序需要进行什么样的操作。这是要根据host admin的来定的,在这方面我也没太多经验,这里不过多讨论。P.S. 如果你想知道你的ASP.NET程序需要什么样的权限,你可以通过一个.NET Framework自带的工具来查看。这个工具叫Permissions Calculator Tool,我们可以通过.NET Framework的命令窗口来调用它:

输入:percalc -show D:\MyProjects\Job\bin\Job.dll  回车

结果:工具会自动分析assembly里面每个type中的任一method所需要的权限,并把这个结果输出到同目录下的xml文件中。如:

 

第二步:从预定义好的5个级别中选择一个最适合的级别。根据需要,可以选择一个最适合的级别,如High,Medium等等。

第三步:如果没有合适的,自己定义一个级别。如果High级别比需要的权限要大,Medium又比需要的权限要小(e.g. RegistryPermission)怎么办?此时,我们可以考虑自定义一个级别。为了简单化,我们可以copy整个Medium policy,然后在其中添加上RegistryPermission,这样就成了我们自己的自定义level,还是很简单明了吧 :)

所有不同级别的配置文件都可以在 C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG 目录下找到。为了自定义一个machine-level的配置,我们可以在此目录创建一个新的xml文件,命名为custom.config,然后将web_mediumtrust文件内容都copy进去。这样我们的自定义级别就有了和Medium相同的权限。为了有更高的权限,我们需要将RegistryPermission手动添加进去。这个过程分为三个步骤:

1) 在<SecurityClass> section添加这段代码:

Code


2) 在如下section中添加这段代码:

Code


3) 将自定义级别定义到machine-level的web.config中:

Code

 

第四步:定义级别不允许被覆盖。我们只需要将刚才的 allowOverride 设置为 false 即可。

第五步:测试效果。可以在本机新建一个ASP.NET程序,然后部署到本机的IIS中。然后可以测试下只有Full level或High level下可以访问的代码现在能否访问。以及除了Medium level的代码,RegistryPermission能否访问。

P.S. 这里有一篇非常好的MSDN文章就详细讲解了CAS,本文也参考了这篇文章。

Have a nice day!

posted on   Wencui  阅读(2864)  评论(6编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示