保护 ClickOnce 应用程序
ClickOnce 应用程序受 .NET Framework 中代码访问安全性约束的限制,以帮助限制代码访问受保护的资源和操作的权限。 因此,了解代码访问安全性的含义以相应地编写 ClickOnce 应用程序是十分重要的。 您的应用程序可以使用完全信任或使用部分区域(如 Internet 区域和 Intranet 区域)来限制访问权限。
此外,ClickOnce 使用证书验证应用程序发布者的真实性,并使用证书为应用程序和部署清单签名,以证明文件未被篡改。 签名是一个可选的步骤,它会使在生成清单以后更改应用程序文件更容易。 然而,如果没有签名的清单,就很难确保应用程序安装程序在受到中间人安全攻击时不被篡改。 出于这个原因,我们建议您对应用程序清单和部署清单进行签名,以帮助保护您的应用程序。
区域
使用 ClickOnce 技术部署的应用程序被限定为由安全区域定义的一组权限和操作。 安全区域是在浏览器中定义的,并且基于应用程序的位置。 下表列出基于部署位置的默认权限:
部署位置 | 安全区域 |
---|---|
从 Web 运行 | Internet 区域 |
从 Web 安装 | Internet 区域 |
从网络文件共享安装 | 本地 Intranet 区域 |
从 CD-ROM 安装 | 完全信任 |
默认权限取决于部署初始应用程序版本的位置;应用程序的更新将继承这些权限。 如果将应用程序配置为从 Web 或网络位置检查是否有更新且存在较新的版本,则初始安装可以获得 Internet 或 Intranet 区域的权限,而不是完全信任权限。 如果不想让系统提示用户,系统管理员可以指定一个 ClickOnce 部署策略,将某个特定的应用程序发行者定义为受信任的来源。 对于部署了此策略的计算机,系统会自动授予权限,而不会提示用户。 有关详细信息,请参阅 Trusted Application Deployment Overview。 若要配置受信任的应用程序部署,可以将证书安装到计算机或企业级别。 有关详细信息,请参阅 How to: Add a Trusted Publisher to a Client Computer for ClickOnce Applications。
注意
在适用于 .NET Core 和 .NET 5 或更高版本的 ClickOnce 中,不支持此功能。 有关详细信息,请参阅适用于 .NET 的 ClickOnce。
代码访问安全性策略
应用程序的权限由应用程序清单的 <trustInfo> 元素中的设置决定。 Visual Studio 会根据项目的“安全性”属性页上的设置自动生成此信息。 ClickOnce 应用程序仅被授予它所请求的特定权限。 例如,文件访问需要完全信任权限时,如果应用程序请求文件访问权限,则它仅被授予文件访问权限,而不会被授予完全信任权限。 在开发 ClickOnce 应用程序时,你应确保仅请求应用程序需要的特定权限。 在大多数情况下,你可以使用 Internet 区域和本地 Intranet 区域来将你的应用程序限制为部分信任。 有关更多信息,请参阅如何:为 ClickOnce 应用程序设置安全区域。 如果应用程序需要自定义权限,则您可以创建一个自定义区域。 有关详细信息,请参阅如何:设置 ClickOnce 应用程序的自定义权限。
注意
在适用于 .NET Core 和 .NET 5 或更高版本的 ClickOnce 中,不支持此功能。 有关详细信息,请参阅适用于 .NET 的 ClickOnce。
如果包括应用程序部署区域的默认权限集以外的权限,则会导致在安装或更新时提示最终用户授予权限。 如果不想让系统提示用户,系统管理员可以指定一个 ClickOnce 部署策略,将某个特定的应用程序发行者定义为受信任的来源。 在部署了此策略的计算机上,系统会自动授予权限,而不会提示用户。
作为开发人员,您有责任确保您的应用程序将以适当的权限运行。 如果应用程序在运行时请求区域之外的权限,则可能会出现安全性异常。 Visual Studio 使你能在目标安全区域中调试应用程序,且有助于开发安全的应用程序。 有关详细信息,请参阅调试使用 System.Deployment.Application 的 ClickOnce 应用程序。
有关代码访问安全性和 ClickOnce 的更多信息,请参阅 ClickOnce 应用程序的代码访问安全性。
代码签名证书
若要使用 ClickOnce 部署发布应用程序,可以用公钥/私钥对为应用程序的应用程序和部署清单签名。 “项目设计器” 的 “签名”页上提供了用于为清单签名的工具。 有关更多信息,请参见 Signing Page, Project Designer。
为清单签名之后,安装期间,权限对话框将向用户显示基于 Authenticode 签名的发行者信息,以向用户表明该应用程序来自受信任的来源。
有关 ClickOnce 和证书的更多信息,请参见 ClickOnce and Authenticode。
ASP.NET 基于窗体的身份验证
如果要控制每个用户能访问哪些部署,则不应允许对 Web 服务器上部署的 ClickOnce 应用程序进行匿名访问。 而应根据用户的身份使用 Windows 身份验证允许用户访问已安装的部署。
ClickOnce 使用持久性 Cookie,所以它不支持基于 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 Community 用户指南的 ClickOnce 部分。