保护 ClickOnce 应用程序
ClickOnce 应用程序受 .NET Framework 中代码访问安全性约束的限制,以帮助限制代码访问受保护的资源和操作的权限。 因此,了解代码访问安全性的含义以相应地编写 ClickOnce 应用程序是十分重要的。 您的应用程序可以使用完全信任或使用部分区域(如 Internet 区域和 Intranet 区域)来限制访问权限。
此外,ClickOnce 使用证书验证应用程序发行者的真实性,并使用证书为应用程序和部署清单签名,以证明文件未被篡改。 签名是一个可选的步骤,它会使在生成清单以后更改应用程序文件更容易。 然而,在没有签名清单的情况下,很难确保应用程序安装程序在受到中间人安全攻击时不被篡改。 出于这个原因,我们建议您对应用程序清单和部署清单进行签名,以帮助保护您的应用程序。
区域
使用 ClickOnce 技术部署的应用程序被限定为由安全区域定义的一组权限和操作。 安全区域在 Internet Explorer 中定义,并基于应用程序的位置。 下表列出基于部署位置的默认权限:
部署位置 |
安全区域 |
---|---|
从 Web 运行 |
Internet 区域 |
从 Web 安装 |
Internet 区域 |
从网络文件共享安装 |
本地 Intranet 区域 |
从 CD-ROM 安装 |
完全信任 |
默认权限取决于部署初始应用程序版本的位置;应用程序的更新将继承这些权限。 如果将应用程序配置为从 Web 或网络位置检查是否有更新且存在较新的版本,则初始安装可以获得 Internet 或 Intranet 区域的权限,而不是完全信任权限。 如果不想让系统提示用户,系统管理员可以指定一个 ClickOnce 部署策略,将某个特定的应用程序发行者定义为受信任的来源。 对于部署此策略的计算机,系统会自动授予权限而不会提示用户授予权限。 有关更多信息,请参见受信任的应用程序部署概述。 若要配置受信任的应用程序部署,可以将证书安装到计算机或企业级别。 有关更多信息,请参见如何:为 ClickOnce 应用程序向客户端计算机添加一个受信任的发行者。
代码访问安全性策略
应用程序的权限由应用程序清单的 <trustInfo> 元素(ClickOnce 应用程序) 元素中的设置决定。 Visual Studio 会根据项目的**“安全性”**属性页上的设置自动生成此信息。 ClickOnce 应用程序仅被授予它所请求的特定权限。 例如,文件访问需要完全信任权限时,如果应用程序请求文件访问权限,则它仅被授予文件访问权限,而不会被授予完全信任权限。 在开发 ClickOnce 应用程序时,您应该确保仅请求应用程序所需的特定访问权限。在大多数情况下,可以使用 Internet 或本地 Intranet 区域来将您的应用程序限制为部分信任。 有关更多信息,请参见如何:为 ClickOnce 应用程序设置安全区域。 如果应用程序需要自定义权限,则您可以创建一个自定义区域。 有关更多信息,请参见如何:设置 ClickOnce 应用程序的自定义权限。
如果包括应用程序部署区域的默认权限集以外的权限,则会导致在安装或更新时提示最终用户授予权限。 如果不想让系统提示用户,系统管理员可以指定一个 ClickOnce 部署策略,将某个特定的应用程序发行者定义为受信任的来源。 在部署此策略的计算机上,系统会自动授予权限而不会提示用户授予权限。
作为开发人员,您有责任确保您的应用程序将以适当的权限运行。 如果应用程序在运行时请求区域之外的权限,则可能会出现安全性异常。 Visual Studio 使您可以在目标安全区域中调试应用程序,并能帮助您开发安全的应用程序。 有关更多信息,请参见如何:使用受限权限对 ClickOnce 应用程序进行调试。
有关代码访问安全性和 ClickOnce 的更多信息,请参见ClickOnce 应用程序的代码访问安全性。
代码签名证书
若要使用 ClickOnce 部署发布应用程序,可以用公钥/私钥对为应用程序的应用程序和部署清单签名。 **“项目设计器”的“签名”**页上提供了用于为清单签名的工具。 有关更多信息,请参见“项目设计器”->“签名”页。 或者可以使用 发布向导 在发布过程中以密钥文件对清单签名。 此外,Windows 软件开发包 (SDK) 包含一个文件签名工具(SignTool.exe(签名工具)),使您可以对清单进行签名。
为清单签名之后,安装期间,权限对话框将向用户显示基于 Authenticode 签名的发行者信息,以向用户表明该应用程序来自受信任的来源。
有关 ClickOnce 和证书的更多信息,请参见 ClickOnce 和 Authenticode。
ASP.NET 基于窗体的身份验证
如果要控制每个用户能访问哪些部署,则不应允许对 Web 服务器上部署的 ClickOnce 应用程序进行匿名访问。 而应根据用户的身份使用 Windows 身份验证允许用户访问已安装的部署。
ClickOnce 使用持久性 Cookie,所以它不支持基于 ASP.NET 窗体的身份验证;这些 Cookie 会带来安全风险,因为它们驻留在 Internet Explorer 缓存中,可能受到攻击。 因此,如果部署 ClickOnce 应用程序,将不支持除 Windows 身份验证以外的任何身份验证方案。
传递参数
如果必须将参数传递到 ClickOnce 应用程序中,则将出现一项额外的安全性注意事项。 ClickOnce 使开发人员可以向部署在 Web 上的应用程序提供查询字符串。 该查询字符串采用了在用于启动应用程序的 URL 末尾跟随一系列名称/值对的形式:
http://servername.adatum.com/WindowsApp1.application?username=joeuser
默认情况下,查询字符串参数处于禁用状态。 若要启用查询字符串,则必须在应用程序部署清单中设置特性 trustUrlParameters。 此值可通过 Visual Studio 和 MageUI.exe 来设置。 有关如何启用传递查询字符串的详细步骤,请参见如何:在联机 ClickOnce 应用程序中检索查询字符串信息。
在未检查参数以确保参数安全的情况下,决不要将通过查询字符串检索的参数传递给数据库或命令行。 不安全参数是包含数据库或命令行转义符的参数,这些转义符可以让恶意用户操纵应用程序执行任意命令。
提示
查询字符串参数是在启动时向 ClickOnce 应用程序传递参数的唯一途径。 不能从命令行向 ClickOnce 应用程序传递参数。
部署经过模糊处理的程序集
您可能想要使用 Dotfuscator 对应用程序进行模糊处理,以防止他人对代码进行反向工程处理。 但是,程序集模糊处理并未集成到 Visual Studio IDE 或 ClickOnce 部署过程中。 因此,您将需要使用生成后步骤在部署过程以外执行模糊处理。 生成项目之后,您会在 Visual Studio 之外手动执行下列步骤:
使用 Dotfuscator 执行模糊处理。
使用 Mage.exe 或 MageUI.exe 生成 ClickOnce 清单并签名。 有关更多信息,请参见Mage.exe(清单生成和编辑工具) 和MageUI.exe(图形化客户端中的清单生成和编辑工具)。
将文件手动发布(复制)到部署源位置(Web 服务器、UNC 共享或 CD-ROM)。