用这种方法,程序代码在目标平台上执行是基于一种预先确定的系统许可以及这个源程序本身上的。当Common Language Runtime装载一个可执行程序的时候,它会检查代码并且指定一个信任的级别来控制运行代码的访问到所有受保护的系统资源。这个级别的信任是相对于默认安全策略的,这个默认安全策略是作为已经安装的.NET框架结构的一部分。举个例子来说,默认安装政策定义了用来访问特定系统资源的CLR装载的集合。通过定义系统利用这些特性,在这种结构下可以制作出能让CLR自动的帮助保护用户系统里边的资源的应用软件。
在.NET框架结构下你可以定义不同类的许可。其中包括对系统登录、环境变量、局部文件以及用户界面的不同许可。而且还有允许设计者控制程序来访问SQL (SQLClientPermission)或者OLE (OLEDBPermission) 数据库的能力,系统打印设备(PrintingPermission),创建或者接受TCP/IP连接(SocketPermission),甚至还包括对互联网访问的许可(WebPermission)。你需要对编码访问安全如何工作有所了解,这样才能够开始设计你的系统来实施安全保障。
如果你的程序代码试图访问一个受保护的系统资源,但是却没有经过许可,那么CLR的exception manager就会放出SecurityException。你可以使用try/catch/finally来处理这些exceptions。你也可以使用任意经过定义的类(e.g., WebPermission, SocketPermission, etc.)来控制对受保护的资源的运行时间。其中的每一种都包含了Deny 以及PermitOnly来对运行时间进行定义。
通过调用许可级别的Deny方式,CLR可以限制那些基于相关许可的对受保护系统资源的访问要求。为了删除Deny限制,你的程序代码要调用RevertDeny方式。为了定义哪些资源是不可以被访问的,你可以使用PermitOnly方式来指定哪些资源是该程序代码可以访问的。PermitOnly方式调用不能够授权超过当前级别的信任。举个例子来说,如果CLR决定某些来自互联网的程序代码对于在浏览器cache中的数据只有只读的权利,那么,你的程序就不能使用PermitOnly来访问当地的硬盘了。当我们使用PermitOnly的时候,只有那些被特定方式指定过的受保护资源在被访问的时候才不会引起CLR放出security exception。就像RevertDeny,RevertPermitOnly会取消之前调用PermitOnly所引起的效果。
使用.NET框架结构开发出来的应用软件,就象是,当CLR最终执行了一串程序代码,并且试图访问受保护的资源的时候,实际的调用是在调用堆栈深处的。就这一点来说,CLR证实了序列中的每一个调用都有它所需的许可,通过这个许可来完成需求的操作。每一个在堆栈中的组件都有一个相联系的堆栈结构,其中包含了指定的信任级别。如果任何调用的组件没有必要的许可的话,那么就无法访问受保护的资源,那么这个操作就会失败,而且还会出现security exception。这也意味着CLR会在每一时间都经过堆栈。通过检查每一个组件的安全性,CLR可以避免被调用的组件使用调用它的那个级别的信任。
使用code access security特性需要有保持平衡以及性能的能力。何时、如何执行code access security,以及如何维护局部信任级别将会允许你能够更为准确的平衡这些需求。
欢迎评论或投稿