在 .NET Framework 4 版 中,为简化安全性系统,对代码访问安全性 (CAS) 进行了重大更改。 在较早版本的 .NET Framework 中,托管应用程序的权限由安全策略规则确定,这些规则是在计算机范围内设定的,用于建立运行时设置。 从 .NET Framework 4 开始:
安全策略不再起作用。 仍使用权限;只是取消了策略系统。
应用程序的访问权限由两个因素决定:应用程序的权限(由其应用程序域确定的授予集),及其透明度。 所有部分信任应用程序均分类为透明代码。 透明应用程序不用考虑安全性。 透明度最初用于 Microsoft Silverlight,它现在已扩展到所有宿主环境中。
桌面和本地 Intranet 应用程序被授予完全信任权限。
![]() |
---|
对 CAS 的主要更改是安全策略的取消。CAS 本身并未取消;只是不再使用策略(以及一些权限请求)。 |
本主题简要概述 .NET Framework 4 中的 CAS 更改。 有关更多信息,请参见 .NET Framework 4 中的安全性更改。
沙盒和权限模型
以下列表介绍 .NET Framework 4 中桌面和寄宿应用程序的信任模型。 有关更多信息,请参见 .NET Framework 4 中的安全性更改。
**桌面应用程序。**和以前版本的 .NET Framework 一样,位于桌面的托管应用程序(除非已从 Web 下载这些应用程序)被授予完全信任权限。 位于本地 Intranet 上共享位置的应用程序也将具有完全信任权限。 您不能再使用策略根据应用程序在本地硬盘驱动器中的文件夹来限制该对该程序的权限。
**寄宿应用程序。**在沙盒中运行的应用程序(例如,基于 Silverlight 的应用程序)被授予有限的一组权限,这些权限确定它们可以访问哪些计算机资源(例如,允许它们使用哪些文件)。 沙盒提供将沙盒中的某些程序集标识为部分受信任,以及将某些程序集标识为完全受信任的功能。 部分信任程序集被授予一组特定权限,这些权限由创建沙盒的应用程序域 (System.AppDomain) 确定。 完全信任库中的某些完全信任代码可以由部分受信任代码调用。 该受信任代码可以调用计算机上的受保护资源。 但是,必须对可以调用受保护资源的、可公开访问的完全信任类型和成员进行安全审核。 根据下一节中的讨论,这些成员分类为可靠关键的成员。 它们可以由部分信任(透明)代码调用,而接下来它们可以调用关键代码。
安全透明度
安全透明度可区分安全敏感代码和非安全敏感代码。 在 .NET Framework 2.0 版 中引入此功能后,通过为必须执行安全敏感操作的代码添加安全关键批注,可以更加轻松地进行安全审核。 这意味着,不是安全关键代码(即,透明代码)的任何代码不需要进行彻底检查。 但是,在这些早期版本的 .NET Framework 中,只有 Microsoft 代码使用了透明度。
在 .NET Framework 4 中,此模型已得到扩展并且规则更加严格,使安全透明度成为一种强制模型。 在此增强模型中,将能够更加轻松地识别可由部分信任应用程序调用的安全敏感代码。 这将进一步减少必须审核的外围应用。
下表说明用于批注代码的透明度类别和相关特性。
安全类别 |
特性 |
说明 |
---|---|---|
透明 |
不执行任何操作的固有安全敏感代码。 |
|
关键 |
可执行任何操作,但无法从部分信任应用程序调用的代码。 |
|
安全关键的 |
可执行任何操作,并且可以从部分信任应用程序调用的代码。 这是安全中间层,其目的是在调用关键代码之前执行适当的安全检查和验证。 |
透明代码无法执行以下操作,无论授予其何种权限:
包含无法验证的代码。
使用平台调用。
执行 Assert 操作。
调用关键代码。
从关键代码派生。
调用受 LinkDemand 保护的代码(即,视为关键代码的代码)。
如果您的代码试图违反这些规则,将会引发异常(即使您的代码具有完全信任权限)。 有关更多信息,请参见 .NET Framework 4 中的安全性更改。
请注意,安全敏感性在公共语言运行时 (CLR) 中定义为对透明代码禁止的操作。 透明度模型不能抵御特定情况下的安全违规,例如在域中存储密码。
安全模型的工作原理
每个 AppDomain 都具有关联的权限集,该权限集是由宿主方案中的宿主定义的。 (该权限集对未寄宿的代码是完全信任的。)
部分信任代码始终是透明的;因此,它无法执行禁止透明代码执行的操作(参见透明度)。
默认情况下,完全信任代码是关键代码,除非已将其标记为透明。 如果将桌面应用程序标记为透明,则它无法调用关键代码,即使它具有完全信任权限。
宿主和 .NET Framework 可以对部分信任代码公开库。 这些库混合了透明代码、关键代码和可靠关键代码。
在使用关键功能之前,可靠关键代码必须要求适当的权限。 例如,File.Open 方法在打开文件之前会要求 FileIOPermission。
在调用关键功能的前后,可靠关键代码还必须进行其他一些检查和验证。 例如,在将异常和消息传递给部分受信任的代码之前,可能必须对这些异常和消息进行筛选。
当部分信任代码调用关键代码之前,关键代码必须断言它所需要的权限,因为关键代码可能执行不允许部分信任代码执行的某些操作。