一聚教程网:一个值得你收藏的教程网站

热门教程

asp.net Silverlight 应用程序安全模型

时间:2022-06-25 06:57:06 编辑:袖梨 来源:一聚教程网

这里面有个概念,什么是信任环境?什么又是部分信任环境?
答案是:运行本地计算机上代码的环境就是信任环境(如机器码的运行环境本地计算机,.NET的IL代码的运行环境CLR),运行(从本地计算机外部加载的)代码的环境就是部分信任环境(如javascript脚本的运行环境是浏览器,Silverlight应用程序的运行环境是Silverlight版CLR),部分信任环境中的代码一般都是从网络上加载来的。
沙盒这个名字挺形象的,我们可以把它想象成一个盒子,来与本地运行环境进行隔离,以使沙盒中的代码不能访问本机资源和代码。浏览器与Silverlight运行环境、电子邮件等都是沙盒。
 对于Silverlight应用程序,其运行的沙盒是Silverlight CLR,不过其允许访问的最大范围是其所在的html页面,可以操作html页面上得dom和js代码。还可以访问Silverlight独立存储中的资源。但除了这些,决不能访问客户计算机上的其他资源了,否则就无异于病毒了。
说明:可以对在浏览器外运行的 Silverlight 4 及之后的应用程序进行配置,使其运行在受信任的环境中,从而避开许多沙盒功能限制。创建这些类型的应用程序时应加以小心。
代码类型
Silverlight 中有两个代码类型:平台代码和应用程序代码。"平台代码"是由 Silverlight 运行时和 SDK 提供的 API。"应用程序代码"是您使用平台代码编写的代码。
安全级别
 
Silverlight 代码具有三个安全级别,从低到高分别是:“透明”、“安全关键”和“关键”。所有应用程序代码都是透明代码。
 
"关键代码"是能够执行安全沙盒外部的操作(如写入文件系统)的代码。"安全关键代码"是位于关键代码顶部的一个代码层,可帮助确保调用是安全的。平台代码可以是透明的、安全关键的或关键的。下图显示了三个安全级别。
从图中我们可以看到,透明代码可以调用安全关键代码,安全关键代码可以调用关键代码,但透明代码不能直接调用关键代码,否则会MethodAccessException异常。
Silverlight 应用程序中的透明代码具有下列限制:
  • 不能包含无法验证的代码。这意味着所有代码都必须是可验证为类型安全的。
  • 不能通过 P/Invoke 或 COM 互操作调用本机代码。
  • 不能访问关键代码或数据,除非目标是标记为安全关键的。
安全关键代码可帮助确保透明代码安全地执行关键操作。安全关键 API 在将控件传递到关键 API 之前,通常会执行各种检查,包括验证传入的参数和确保应用程序状态支持继续进行调用。在允许安全关键调用继续执行后,它将代表调用方调用一个关键方法,或者直接执行操作。
例如,向文件系统写入内容的操作实现为关键代码。为了能够访问文件系统中的永久存储区,Silverlight 提供了一项安全关键功能,称为“独立存储”。当 Silverlight 应用程序调用独立存储 API 时,该 API 通过确保应用程序正在请求有效的文件并且未超过其存储配额来验证请求。然后,独立存储 API 调用关键 API,以执行读写硬盘的实际工作。
用户启动
安全关键代码还可以通过另一种方式 - 要求用户启动 - 来确保调用的安全性。这意味着要使用 Silverlight 的某些功能,您必须请求用户输入内容。例如,用户必须单击某个按钮来显示 OpenFileDialog。如果试图在没有用户输入的情况下显示 OpenFileDialog,将出现 SecurityException。通过请求用户输入以启用许多功能,Silverlight 可向用户明确他们运行的哪些应用程序正要求提升的特权。下面是需要用户启动的功能列表:
 
应用程序功能
详细信息
文件系统访问
文件系统访问受到限制,并且大多数对话框必须是用户启动的。有关更多信息,请参见对话框概述。
全屏模式
全屏模式必须是用户启动的并且显示与如何退出该模式有关的消息。在用户按 ESC 键或者切换到其他窗口时,应用程序将自动退出全屏模式。有关更多信息,请参见全屏支持。
网络摄像机和麦克风支持
网络摄像机或麦克风的使用必须是用户启动的。用户必须在安全提示中授予权限。
Silverlight 4 和更高版本。
打印
“打印”对话框必须是用户启动的。有关更多信息,请参见打印。
Silverlight 4 和更高版本。
剪贴板访问
剪贴板访问必须是用户启动的。用户必须在安全提示中授予权限。在关闭当前页或者用户离开当前页时权限结束。有关更多信息,请参见 Clipboard。
Silverlight 4 和更高版本。
 
安全属性

若要指定安全级别,应向平台代码添加属性。所有应用程序代码都必须是透明的,并且不应使用安全属性标记。如果应用程序代码用某一安全属性标记,则在尝试不安全的调用时将忽略该属性并且将发生异常。

热门栏目