ClickOnce 应用程序基于 .NET Framework,并且受代码访问安全约束的约束。 因此,请务必了解代码访问安全性的影响,并相应地编写 ClickOnce 应用程序。
代码访问安全性是 .NET Framework 中的一种机制,可帮助限制代码对受保护资源和作的访问。 应为 ClickOnce 应用程序配置代码访问安全权限,以使用适合应用程序安装程序位置的区域。 在大多数情况下,可以为有限的权限集选择 Internet 区域,也可以选择 本地 Intranet 区域以获取更大的权限集。
注释
在 ClickOnce for .NET Core 和 .NET 5 或更高版本中,不支持代码访问安全性。 在 .NET Framework 中,使用代码访问安全性不是最佳做法,不建议这样做。
默认 ClickOnce 代码访问权限安全性
默认情况下,ClickOnce 应用程序在客户端计算机上安装或运行时会收到完全信任权限。
具有完全信任权限的应用程序对文件系统和注册表等资源的访问权限不受限制。 这可能会导致你的应用程序(和最终用户的系统)被恶意代码利用。
当应用程序需要完全信任权限时,可能会提示最终用户向应用程序授予权限。 这意味着应用程序不会真正提供 ClickOnce 体验,并且提示可能会令不太有经验的用户感到困惑。
注释
从可移动媒体(如 CD-ROM)安装应用程序时,不会提示用户。 此外,网络管理员可以配置网络策略,以便在用户从受信任的源安装应用程序时不提示用户。 有关详细信息,请参阅 受信任的应用程序部署概述。
若要限制 ClickOnce 应用程序的权限,可以修改应用程序的代码访问安全权限,以请求最适合应用程序所需的权限的区域。 在大多数情况下,可以选择从中部署应用程序的区域。 例如,如果应用程序是企业应用程序,则可以使用 本地 Intranet 区域。 如果应用程序是 Internet 应用程序,则可以使用 Internet 区域。
配置安全权限
应始终将 ClickOnce 应用程序配置为请求相应的区域来限制代码访问安全权限。 可以在项目设计器的安全页上配置安全权限。
项目设计器中的“安全”页包含“启用 ClickOnce 安全设置”复选框。 选中此复选框后,安全权限请求将添加到应用程序的部署清单。 在安装时,如果请求的权限超出部署应用程序的区域的默认权限,系统会提示用户授予权限。 有关详细信息,请参阅 “如何:启用 ClickOnce 安全设置”。
从不同位置部署的应用程序被授予不同级别的权限,而无需提示。 例如,从 Internet 部署应用程序时,它会收到一组高度限制的权限。 从本地 Intranet 安装时,它会收到更多权限,从 CD-ROM 安装时,它会收到完全信任权限。
作为配置权限的起点,可以从“安全”页上的“区域”列表中选择安全区域。 如果应用程序可能从多个区域部署,请选择具有最低权限的区域。 有关详细信息,请参阅 “如何:为 ClickOnce 应用程序设置安全区域”。
可设置的属性因权限集而异;并非所有权限集都具有可配置的属性。 有关应用程序可以请求的权限的完整列表的详细信息,请参阅 System.Security.Permissions。 有关如何设置自定义区域的权限的详细信息,请参阅 “如何:设置 ClickOnce 应用程序的自定义权限”。
调试具有受限权限的应用程序
作为开发人员,你很可能使用完全信任权限运行开发计算机。 因此,当您调试应用程序时,由于使用了受限权限,用户在运行应用程序时可能会看到的安全异常不会出现。
为了捕获这些异常,你必须使用与最终用户相同的权限调试应用程序。 可以在安全页面的项目设计器中启用受限权限的调试。
调试具有受限权限的应用程序时,对于尚未在 “安全 ”页上启用的任何代码安全要求,将引发异常。 将显示异常帮助程序,提供有关如何修改代码以防止异常的建议。
此外,编写代码时,代码编辑器中的 IntelliSense 功能将禁用配置的安全权限中不包含的任何成员。
有关详细信息,请参阅 如何:使用受限权限调试 ClickOnce 应用程序。
浏览器托管应用程序的安全权限
Visual Studio 为 Windows Presentation Foundation (WPF) 应用程序提供以下项目类型:
WPF Windows 应用程序
WPF Web 浏览器应用程序
WPF 自定义控件库
WPF 服务库
在这些项目类型中,只有 WPF Web 浏览器应用程序托管在 Web 浏览器中,因此需要特殊的部署和安全设置。 这些应用程序的默认安全设置如下所示:
启用 ClickOnce 安全设置
这是部分信任应用程序
Internet 区域 (WPF Web 浏览器应用程序已选择的默认权限设置)
在 “高级安全设置” 对话框中,“调试此应用程序” 复选框已被选中并禁用。 这是因为无法关闭浏览器托管的应用程序中的“Debug In Zone”功能。