保护 ClickOnce 应用程序

ClickOnce 应用程序受 .NET Framework 中的代码访问安全约束的约束,以帮助限制代码对受保护资源和作的访问。 因此,请务必了解代码访问安全性的影响,以便相应地编写 ClickOnce 应用程序。 应用程序可以使用完全信任或使用部分区域(例如 Internet 和 Intranet 区域)来限制访问。

此外,ClickOnce 使用证书来验证应用程序的发布者的真实性,并对应用程序和部署清单进行签名,以证明文件未被篡改。 签名是一个可选步骤,可更轻松地在生成清单后更改应用程序文件。 但是,如果没有签名的清单,很难确保应用程序安装程序不会在中间人安全攻击中被篡改。 出于此原因,我们建议对应用程序和部署清单进行签名,以帮助保护应用程序。

区域

使用 ClickOnce 技术部署的应用程序仅限于安全区域定义的一组权限和作。 安全区域在浏览器中定义,并基于应用程序的位置。 下表列出了基于部署位置的默认权限:

部署位置 安全区域
从网页运行 互联网区
从 Web 安装 互联网区
从网络文件共享安装 本地内网区域
从 CD-ROM 安装 完全信任

默认权限基于从中部署应用程序的原始版本的位置;对应用程序的更新将继承这些权限。 如果应用程序配置为从 Web 或网络位置检查更新,并且有较新版本可用,则原始安装可以接收 Internet 或 Intranet 区域的权限,而不是完全信任权限。 为了防止出现提示,系统管理员可以指定 ClickOnce 部署策略,该策略将特定应用程序发布者定义为受信任的源。 对于部署此策略的计算机,将自动授予权限,并且不会提示用户。 有关详细信息,请参阅 受信任的应用程序部署概述。 若要配置受信任的应用程序部署,可以将证书安装到计算机或企业级。 有关详细信息,请参阅 如何:在客户端计算机为 ClickOnce 应用程序添加受信任的发布者

注释

在 ClickOnce for .NET Core 和 .NET 5 或更高版本中,此功能不受支持。 有关详细信息,请参阅 ClickOnce for .NET

代码访问安全策略

应用程序的权限由应用程序清单的 <trustInfo> 元素 元素中的设置确定。 Visual Studio 会根据项目 “安全 ”属性页上的设置自动生成此信息。 ClickOnce 应用程序仅授予它请求的特定权限。 例如,如果文件访问需要完全信任权限,如果应用程序请求文件访问权限,则只会授予文件访问权限,而不是完全信任权限。 开发 ClickOnce 应用程序时,应确保仅请求应用程序所需的特定权限。 在大多数情况下,可以使用 Internet 或本地 Intranet 区域将应用程序限制为部分信任。 有关详细信息,请参阅 “如何:为 ClickOnce 应用程序设置安全区域”。 如果应用程序需要自定义权限,则可以创建自定义区域。 有关详细信息,请参阅 “如何:设置 ClickOnce 应用程序的自定义权限”。

注释

在 ClickOnce for .NET Core 和 .NET 5 或更高版本中,不支持代码访问安全性。 在 .NET Framework 中,使用代码访问安全性不是最佳做法,不建议这样做。

包括不属于应用程序部署所在区域默认权限集中的权限将导致在安装或更新时提示最终用户授予权限。 为了防止出现提示,系统管理员可以指定 ClickOnce 部署策略,该策略将特定应用程序发布者定义为受信任的源。 在部署此策略的计算机上,将自动授予权限,并且不会提示用户。

作为开发人员,你有责任确保应用程序将以适当的权限运行。 如果应用程序在运行时请求区域外部的权限,则可能会出现安全异常。 Visual Studio 使你能够在目标安全区域中调试应用程序,并有助于开发安全应用程序。 有关详细信息,请参阅 调试使用 System.Deployment.Application 的 ClickOnce 应用

有关代码访问安全性和 ClickOnce 的详细信息,请参阅 ClickOnce 应用程序的代码访问安全性

代码签名证书

若要使用 ClickOnce 部署发布应用程序,可以使用公钥/私钥对为应用程序签名和部署清单。 项目设计器“签名”页上提供了用于对清单进行签名的工具。 有关详细信息,请参阅 “签名”页,项目设计器

对清单进行签名后,基于 Authenticode 签名的发布者信息将在安装过程中向用户显示在权限对话框中,以显示应用程序源自受信任源的用户。

有关 ClickOnce 和证书的详细信息,请参阅 ClickOnce 和 Authenticode

ASP.NET 基于表单的身份验证

如果要控制每个用户可以访问的部署,不应启用对 Web 服务器上部署的 ClickOnce 应用程序的匿名访问。 相反,你可以基于用户的身份,通过 Windows 身份验证允许用户访问已安装的部署。

ClickOnce 不支持 ASP.NET 基于表单的身份验证,因为它使用持久性 Cookie;这些存在安全风险,因为它们驻留在浏览器缓存中,并且可能会遭到黑客攻击。 因此,如果要部署 ClickOnce 应用程序,则 Windows 身份验证以外的任何身份验证方案都不受支持。

传递参数

如果必须将参数传递到 ClickOnce 应用程序,则会出现额外的安全注意事项。 ClickOnce 使开发人员能够向通过 Web 部署的应用程序提供查询字符串。 查询字符串采用用于启动应用程序的 URL 末尾的一系列名称值对的形式:

http://servername.adatum.com/WindowsApp1.application?username=joeuser

默认情况下,查询字符串参数处于禁用状态。 若要启用它们,必须在应用程序的部署清单中设置该属性 trustUrlParameters 。 可以从 Visual Studio 和 MageUI.exe设置此值。 有关如何启用传递查询字符串的详细步骤,请参阅 如何:检索联机 ClickOnce 应用程序中的查询字符串信息

不应将通过查询字符串检索到的参数传递到数据库或命令行,而无需检查参数以确保这些参数是安全的。 不安全的参数是指包含数据库或命令行转义字符的参数,这些字符可能使恶意用户能够操控应用程序来执行任意命令。

注释

查询字符串参数是启动时将参数传递给 ClickOnce 应用程序的唯一方法。 无法从命令行将参数传递给 ClickOnce 应用程序。

部署混淆程序集

Visual Studio 包括免费的 PreEmptive Protection - Dotfuscator Community,可用于通过代码模糊处理和主动保护措施保护 ClickOnce 应用程序。 有关详细信息,请参阅 Dotfuscator 社区用户指南的 ClickOnce 部分