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添加这段代码:
2) 在如下section中添加这段代码:
3) 将自定义级别定义到machine-level的web.config中:
第四步:定义级别不允许被覆盖。我们只需要将刚才的 allowOverride 设置为 false 即可。
第五步:测试效果。可以在本机新建一个ASP.NET程序,然后部署到本机的IIS中。然后可以测试下只有Full level或High level下可以访问的代码现在能否访问。以及除了Medium level的代码,RegistryPermission能否访问。
P.S. 这里有一篇非常好的MSDN文章就详细讲解了CAS,本文也参考了这篇文章。
Have a nice day!