微软防止不信任的代码进行一定权限的行为的解决方案。
CAS根据代码来自哪里,不同等级地信任代码。
流程:
当CLR加载一个assembly,
首先获得这个assembly的evidence(与assembly相关的信息,例如URL,发布者,所在文件夹等),
来判断assembly所属的code group(包含权限集,由机器管理员决定)
当代码要求一定权限(比如写文件)时,
进行code access demand,
CLR检查赋予call stack中每个方法的权限。
基本介绍完毕。现在来说case。
遇到的问题是和strongnameidentitypermission相关。
为了保护程序集代码只被可信的调用方调用,有一个途径是通过强名称标识来做。但在.net framework 1.1和2.0中该机制的原理不同了。
在 .NET Framework 1.0 和 1.1 版中,即使调用程序集受到完全信任,对标识权限的要求也仍然有效。即,即使调用程序集已获得完全信任,如果该程序集不满足要求的条件,对标识权限的请求也将失败。在 .NET Framework 2.0 版中,如果调用程序集已获得完全信任,则对标识权限的要求将无效。这样做可确保所有权限的一致性,避免了标识权限的处理特殊化现象。
换句话说,在1.1中,是以assembly的安全设置为最大,在2.0中,是以调用的代码的安全设置为最大。
这样就带来一个问题:2.0后,如果在本地(默认完全信任)调用危险的程序集,程序集照样能以完全的权限运行,没有起到限制的作用。难道strongnameidentitypermission就此失效了么?
.Net 2.0中CAS是针对代码执行的信任进行限制而非针对调用者身份进行限制。
CAS中代码包含了evidence,这代表了该代码的来源。
.NET在运行时对evidence进行计算,因为直到assembly执行前.NET都不会对assembly的来源进行分析。
因此如果对某个assembly的调用,就需要限制调用assembly的代码的权限。
(参考资料:http://www.code-magazine.com/Article.aspx?quickid=0405031)
如果要对执行信任等级进行调整,可以使用.Net framework 2.0 configuation(控制面板-〉管理工具)(如果使用的是Windows Server 2008,虽然其默认自带.net framework 2.0,但没有configuration界面,因此需要在微软官方网站下载并安装.Net framework 2.0 SDK)。
我的测试步骤如下:
1. 新建一个class library project,编译为assembly
2. 新建一个console application(C#),调用上述assembly中的方法,调用成功。
3. 打开.Net framework 2.0 configuation,将Enterprise,Machine和User的权限都更改为Nothing(没有任何Permission),再次运行console application,程序运行出错。这表明对调用代码的权限进行了限制。
在测试时可以使用沙箱来进行测试。具体可参考:
"How to: Run Partially Trusted Code in a Sandbox"
<http://msdn.microsoft.com/en-us/library/bb763046.aspx>
另外提醒一下,.NET 3.5 SP1有一个新的特性,local intranet机器的权限默认更改为“Full Trust"。
总结一下,即如果调用者已经获得了某machine上Full Trust的信任等级,那么无法对调用者是否能调用assembly进行限制。因此如果要使该调用者不能调用assembly,需要使用.Net framework 2.0 configuation对调用者使用的调用代码进行限制。
(PS. 也可以尝试一下勾选delay signing(延迟为程序集签名),或许该选项能满足需求)
参考资料:
Find Out What's New with Code Access Security in the .NET Framework 2.0
http://msdn.microsoft.com/zh-cn/magazine/cc163700(en-us).aspx
如何测试托管代码安全
http://space.itpub.net/100788/viewspace-170199
(Some tips on testing managed code Security
http://blogs.msdn.com/eugene_bobukh/archive/2004/03/10/87649.aspx)
代码组
http://whx.tzgt.gov.cn/newOperate/html/1/12/124/10316.html