Windows 窗体应用中的安全性概述

重要

除非另有指定,否则此内容仅适用于 .NET Framework。

在发布 .NET Framework 之前,所有在计算机上运行的代码都拥有与计算机用户相同的权限来访问资源。 例如,如果允许用户访问文件系统,则允许代码访问文件系统;如果允许用户访问数据库,则允许该代码访问该数据库。 尽管对于用户在本地计算机上显式安装的可执行文件中的代码,这些权限或权限是可以接受的,但对于来自 Internet 或本地 Intranet 的潜在恶意代码,这些权限可能不可接受。 此代码不应在未经权限的情况下访问用户的计算机资源。

.NET Framework 引入了一个名为 Code Access Security 的基础结构,用于区分代码具有的权限或权限,以及用户拥有的权限。 默认情况下,来自 Internet 和 Intranet 的代码只能在所谓的部分信任中运行。 部分信任使应用程序受到一系列限制:除其他方面外,应用程序受限于访问本地硬盘,并且无法运行非托管代码。 .NET Framework 根据该代码的标识控制代码访问的资源:其来源、是否具有 Strong-Named 程序集、是否使用证书签名等。

用于部署 Windows 窗体应用程序的 ClickOnce 技术,便于更轻松地开发在部分信任、完全信任或具有提升权限的信任模式下运行的应用程序。 ClickOnce 提供权限提升和受信任的应用程序部署等功能,以便应用程序能够以负责任的方式从本地用户请求完全信任或提升的权限。

了解 .NET Framework 中的安全性

代码访问安全性允许不同程度地信任代码,具体取决于代码的来源以及代码标识的其他方面。 有关公共语言运行时用于确定安全策略的证据的详细信息,请参阅 Evidence。 它有助于保护计算机系统免受恶意代码的侵害,并帮助防止受信任的代码有意或意外地损害安全性。 代码访问安全性还使你能够更好地控制应用程序可以执行的动作,因为你可以指定应用程序需要拥有的权限。 代码访问安全性会影响面向公共语言运行时的所有托管代码,即使该代码未进行单个代码访问安全权限检查。 有关 .NET Framework 中安全性的详细信息,请参阅 关键安全概念代码访问安全基础知识

如果用户直接从 Web 服务器或文件共享运行 Windows 窗体可执行文件,则授予应用程序的信任程度取决于代码所在的位置及其启动方式。 应用程序运行时,会自动进行评估,并从公共语言运行时接收命名权限集。 默认情况下,来自本地计算机的代码被授予“完全信任”权限集,来自本地网络的代码被授予“本地 Intranet”权限集,而来自互联网的代码被授予“Internet”权限集。

注释

在 .NET Framework 版本 1.0 Service Pack 1 和 Service Pack 2 中,Internet 区域代码组接收 Nothing 权限集。 在 .NET Framework 的所有其他版本中,Internet 区域代码组接收 Internet 权限集。

每个权限集中授予的默认权限都列在 默认安全策略 主题中。 根据应用程序接收的权限,应用程序可以正确运行或生成安全异常。

许多 Windows 窗体应用程序将使用 ClickOnce 进行部署。 用于生成 ClickOnce 部署的工具的安全默认值与前面讨论的默认值不同。 有关详细信息,请参阅以下讨论。

授予应用程序的实际权限可以不同于默认值,因为可以修改安全策略;这意味着应用程序可以在一台计算机上具有权限,但不能对另一台计算机具有权限。

开发更安全的 Windows 窗体应用程序

在应用程序开发的所有步骤中,安全性都很重要。 首先查看并遵循 安全编码准则

接下来,确定应用程序是必须在完全信任环境下运行,还是应在部分信任环境中运行。 完全信任地运行应用程序可以更轻松地访问本地计算机上的资源,但如果不严格根据安全编码准则主题设计和开发应用程序,应用程序及其用户将面临较高的安全风险。 以部分信任方式运行应用程序可以更轻松地开发更安全的应用程序并降低大量风险,但需要更规划如何实现某些功能。

如果选择部分信任(即 Internet 或本地 Intranet 权限集),请决定应用程序在此环境中的行为方式。 Windows 窗体提供了在半受信任的环境中实现功能的替代、更安全的方法。 应用程序的某些部分(如数据访问)可以针对部分信任和完全信任环境以不同的方式设计和编写。 某些 Windows 窗体功能(如应用程序设置)旨在以部分信任方式工作。 有关详细信息,请参阅 应用程序设置概述

如果应用程序需要比部分信任条件允许的更多权限,但您又不想在完全信任下运行,则可以在部分信任下运行,同时仅声明您所需的额外权限。 例如,如果您希望在部分信任的环境下运行应用程序,但必须授予它对用户文件系统上某目录的只读访问权限,那么您可以只为该目录请求 FileIOPermission 权限。 正确使用此方法可提高应用程序的功能,并最大程度地降低用户的安全风险。

开发将以部分信任方式运行的应用程序时,请跟踪应用程序必须运行的权限以及应用程序可以选择使用的权限。 当所有权限都已知时,应在应用程序级别对权限发出声明性请求。 请求权限会告知 .NET Framework 运行时应用程序需要哪些权限,以及它特别不需要哪些权限。 有关请求权限的详细信息,请参阅 请求权限

当您请求可选权限时,如果您的应用程序执行了需要但未被授予的权限的操作,则必须处理因此产生的安全异常。 适当的处理 SecurityException 将确保应用程序可以继续运行。 应用程序可以使用异常来确定是否应为用户禁用某个功能。 例如,如果未授予所需的文件权限,应用程序可以禁用 “保存 ”菜单选项。

有时,很难知道是否授予了所有合适的权限。 例如,在表面上看起来无害的方法调用可能会在执行过程中某个时刻访问文件系统。 如果你的应用程序没有配置所有必需的权限,那么虽然在桌面上调试时可能测试正常,但在部署时却可能会出现失败。 .NET Framework 2.0 SDK 和 Visual Studio 2005 都包含用于计算应用程序所需的权限的工具:MT.exe 命令行工具和 Visual Studio 的“计算权限”功能。

以下主题介绍了其他 Windows 窗体安全功能。

主题 DESCRIPTION
- Windows 窗体中的更安全的文件和数据访问 介绍如何在部分信任环境中访问文件和数据。
- Windows 窗体中打印安全性增强 介绍如何访问部分信任环境中的打印功能。
- Windows 窗体中的其他安全注意事项 介绍如何执行窗口操作、使用剪贴板以及在部分信任环境中调用非托管代码。

部署具有适当权限的应用程序

将 Windows 窗体应用程序部署到客户端计算机的最常见方式是 ClickOnce,这是描述应用程序需要运行的所有组件的部署技术。 ClickOnce 使用称为清单的 XML 文件来描述构成应用程序的程序集和文件,以及应用程序所需的权限。

ClickOnce 有两种在客户端计算机上请求提升权限的技术。 这两种技术都依赖于使用 Authenticode 证书。 这些证书有助于为用户提供一些保证,即应用程序来自受信任的源。

下表描述了这些技术。

提升的权限技术 DESCRIPTION
权限提升 首次运行应用程序时,提示用户使用安全对话框。 “ 权限提升 ”对话框告知用户谁发布了应用程序,以便用户可以做出有关是否向其授予额外信任的明智决定
受信任的应用程序部署 涉及系统管理员在客户端计算机上执行发布者的 Authenticode 证书的一次性安装。 从此开始,使用证书签名的任何应用程序都被视为受信任,并且可以在本地计算机上完全信任运行,而无需其他提示。

所选的技术将取决于部署环境。 有关详细信息,请参阅 选择 ClickOnce 部署策略

默认情况下,使用 Visual Studio 或 .NET Framework SDK 工具(Mage.exe 和 MageUI.exe)部署的 ClickOnce 应用程序配置为在具有完全信任的客户端计算机上运行。 如果使用部分信任或仅使用一些其他权限来部署应用程序,则必须更改此默认值。 可以在配置部署时使用 Visual Studio 或 .NET Framework SDK 工具 MageUI.exe 执行此作。 有关如何使用 MageUI.exe的详细信息,请参阅 演练:手动部署 ClickOnce 应用程序。 另请参阅 “如何:为 ClickOnce 应用程序设置自定义权限 ”或 “如何:为 ClickOnce 应用程序设置自定义权限”。

有关 ClickOnce 和权限提升的安全方面的详细信息,请参阅 保护 ClickOnce 应用程序。 有关受信任的应用程序部署的详细信息,请参阅 受信任的应用程序部署概述

测试应用程序

如果已通过 Visual Studio 部署 Windows 窗体应用程序,则可以在开发环境中启用在部分信任或受限权限集环境中的调试功能。 另请参阅 如何:使用受限权限调试 ClickOnce 应用程序

另请参阅