Windows Presentation Foundation 安全性

更新:2007 年 11 月

本主题介绍了 Windows Presentation Foundation (WPF) 独立应用程序和浏览器承载的应用程序的安全模型。

无论 WPF 独立应用程序是使用 Windows Installer (.msi)、DOS XCopy 还是使用 ClickOnce 进行部署,都将使用无限制的权限(CAS FullTrust 权限集)执行。

WPF 浏览器承载的应用程序由 Windows Internet Explorer 承载,可以是 XAML 浏览器应用程序 (XBAP),也可以是可扩展应用程序标记语言 (XAML)(请参见 Windows Presentation Foundation XAML 浏览器应用程序概述)。

WPF 浏览器承载的应用程序在一个部分信任的安全沙盒中执行,在默认情况下,仅限于默认 CAS Internet 权限集。这可以有效地将 WPF 浏览器承载的应用程序与客户端计算机进行隔离,采用的方法类似于希望隔离典型 Web 应用程序所用的方法。在 Windows Presentation Foundation 部分信任安全性中详细介绍了部分信任安全性。

本主题包括下列各节。

  • 安全导航
  • Internet Explorer 安全设置
  • 对于部分受信任的客户端应用程序禁用 APTCA 程序集
  • 沙盒外部松散 XAML
  • 开发安全 WPF 应用程序的最佳方案
  • 相关主题

安全导航

对于 XBAP,WPF 区分两种类型的导航范围:应用程序和浏览器。

应用程序导航 是在浏览器承载的应用程序中的内容项之间进行导航,而浏览器导航 则是更改浏览器本身的内容。应用程序范围导航和浏览器范围导航之间的关系如下图所示:

导航示意图

是否将内容类型视为可供 XBAP 安全导航主要取决于是发生了应用程序导航还是浏览器导航。

应用程序导航的安全性

如果应用程序范围的导航可以使用打包的 URI 来标识,则将该应用程序范围导航视为安全的,它支持四种类型的内容:

  • 资源文件,即使用 Resource 生成类型添加到项目中的文件,该文件可以使用类似如下的 URI 进行标识:

    pack://application:,,,/MyResourceFile.xaml

  • 内容文件,即使用 Content 生成类型添加到项目中的文件,该文件可以使用类似如下的 URI 进行标识:

    pack://application:,,,/MyContentFile.xaml

  • 源站点文件,即使用 None 生成类型添加到项目中的文件,该文件可以使用类似如下的 URI 进行标识:

    pack://siteoforigin:,,,/MySiteOfOriginFile.xaml

  • 应用程序代码文件,即使用 Page 生成类型添加到项目中的文件,该文件可以使用类似如下的 URI 进行标识:

    pack://application:,,,/MyResourceFile.xaml

说明:

有关应用程序数据文件和打包的 URI 的更多信息,请参见 Windows Presentation Foundation 应用程序资源、内容和数据文件

用户导航或编程导航的结果是可以浏览到这些内容类型的文件:

  • 用户导航。用户通过单击 Hyperlink 元素发起该导航。

  • 编程导航。用户不介入的情况下,应用程序发起该导航。

浏览器导航的安全性

只有在以下条件下,才将浏览器导航视为是安全的:

  • 用户导航。用户通过单击 Hyperlink 元素发起该导航。

  • 区域。导航到的内容位于 Internet 或本地 Intranet。

  • 协议。使用的协议是 http:https:file:mailto:

如果 XBAP 尝试以不符合这些条件的方式导航内容,则引发一个 SecurityException

Internet Explorer 安全设置

Internet Explorer 提供了一种机制,通过它可以配置允许由 Internet Explorer 执行的功能或来自它的功能,包括下面各项:

  • .NET Framework 相关组件

  • ActiveX 控件和插件

  • 下载

  • 脚本

  • 用户身份验证

一个功能是否可以运行以及如何运行都取决于安全性设置。您可以将安全性设置配置成完全禁用一个功能,或在功能每次尝试运行时提示用户做出决定。

对于 InternetIntranet可信站点不可信站点区域,需要分别在每个区域中配置通过这种方式确保安全的功能集合。可以通过执行以下操作配置该安全设置:

  1. 打开 Internet Explorer

  2. 在**“工具”菜单上单击“选项”|“安全”**。

  3. 选择要为其配置安全设置的区域。

  4. 单击**“自定义级别”**按钮

这将打开**“安全设置”**对话框,以便为所选区域配置安全设置。

“安全设置”对话框

Windows Internet Explorer 7 包含以下四种专门为 .NET Framework 提供的安全设置:

  • 松散的 XAML。控制 Internet Explorer 7 是否可以导航到松散的 XAML 文件。(“启用”、“禁用”和“提示”选项)。

  • XAML 浏览器应用程序。控制 Internet Explorer 7 是否可以导航到 XBAP 并运行它。(“启用”、“禁用”和“提示”选项)。

  • XPS 文档。控制 Internet Explorer 7 是否可以导航到 XML 纸张规范 (XPS) 文档并加载它。(“启用”、“禁用”和“提示”选项)。

  • 启用 .NET Framework 安装程序。控制是否可以通过 Internet Explorer 7 安装 .NET Framework。(仅“启用”和“禁用”选项)。

  • 在默认情况下,对 Internet本地 Intranet受信任站点区域启用所有这些设置,而对不可信站点区域则禁用这些设置。

IE6 和更低版本的安全设置

对于 Internet Explorer 之外的 Internet Explorer 版本,可以在注册表中的以下项下配置各种与 .NET Framework 相关的安全设置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Windows Presentation Foundation\Features

下表列出了可以设置的值。

值名称

值类型

值数据

XBAPDisallow

REG_DWORD

1 为禁止;0 为允许。

LooseXamlDisallow

REG_DWORD

1 为禁止;0 为允许。

WebBrowserDisallow

REG_DWORD

1 为禁止;0 为允许。

XPSDocumentsDisallow

REG_DWORD

1 为禁止;0 为允许。

MediaAudioDisallow

REG_DWORD

1 为禁止;0 为允许。

MediaImageDisallow

REG_DWORD

1 为禁止;0 为允许。

MediaVideoDisallow

REG_DWORD

1 为禁止;0 为允许。

说明:

在这些设置中,XBAPDisallowWebBrowserDisallow 对所有版本的 Internet Explorer 都有效。

对于部分受信任的客户端应用程序禁用 APTCA 程序集

当托管的程序集安装到全局程序集缓存 (GAC) 时,它们将变为完全受信任,这是因为用户在安装这些程序集时必须提供明确的权限。因为这些程序集是完全受信任的,所以只有完全受信任的托管客户端应用程序才可以使用它们。若要允许部分受信任的应用程序使用它们,则必须使用 AllowPartiallyTrustedCallersAttribute (APTCA) 来对其进行标记。只有经过测试可在部分信任的情况下安全执行的程序集才应该使用此属性进行标记。

但是,APTCA 程序集在安装到 GAC 后,可能会暴露出安全漏洞。一旦发现安全漏洞,程序集发行者可以生成一个修补程序以在现有的安装程序上修复该问题,还可以生成两个针对发现该问题后可能发生的安装过程的保护程序。即使卸载程序集有可能中断使用该程序集的其他完全受信任的客户端应用程序,该修补程序中也设置了一个用于卸载程序集的选项。

WPF 提供了一种机制,可以通过该机制对部分受信任的 WPF 应用程序(包括 XBAP)禁用 APTCA 程序集,而无需卸载 APTCA 程序集。

若要禁用 APTCA 程序集,您需要在以下注册表项下创建一个特殊项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\<AssemblyFullName>, FileVersion=<AssemblyFileVersion>

下面演示了一个示例项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\aptcagac, Version=1.0.0.0, Culture=neutral, PublicKeyToken=215e3ac809a0fea7, FileVersion=1.0.0.0

这将为 APTCA 程序集建立一个项,不过还需要在该项下创建一个值来启用/禁用该程序集。下面是需要创建的值的详细信息:

  • 值名称:APTCA_FLAG

  • 值类型:REG_DWORD

  • 值数据:1 为禁用;0 为启用。

需要以此方式对部分受信任的客户端应用程序禁用的程序集的发行者可以编写一个修补程序,来为该程序集创建注册表项和值条目。

说明:

由于核心的 .NET Framework 程序集是托管应用程序运行所需的,因此以此方式禁用上述程序集并不会使其受到影响。为禁用 APTCA 程序集提供的支持主要面向第三方和非 .NET Framework。

沙盒外部松散 XAML

松散 XAML 文件是仅标记 .xaml 文件,无法通过打包的 URI 来标识(请参见 Windows Presentation Foundation 中的 Pack URI)。这意味着它们不是资源、内容或源站点文件(请参见 Windows Presentation Foundation 应用程序资源、内容和数据文件)。

当从 Internet Explorer 中直接导航至松散 XAML 文件时,默认 Internet 区域权限集将这些文件置于安全沙盒内。

但是,当从独立应用程序中的 NavigationWindowFrame 导航至松散 XAML 文件时,安全行为将有所不同。

在这两种情况下,导航到的松散 XAML 文件将继承其宿主应用程序的权限。但是,从安全性的角度讲,此行为可能不是很理想,尤其是如果一个松散 XAML 文件是由一个不受信任或未知的实体产生,则更是如此。这种内容称为外部内容,当导航至这些内容时可以配置 FrameNavigationWindow 以将其隔离。通过将 SandboxExternalContent 属性设置为 true,可以实现隔离,如以下 FrameNavigationWindow 的示例所示:

<Frame 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</Frame>
<!-- Sandboxing external content using NavigationWindow-->
<NavigationWindow 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</NavigationWindow>

使用此设置,可以将外部内容加载到独立于承载此应用程序的进程的进程。此进程将被限制在默认 Internet 区域权限集中,从而可以有效地将其与宿主应用程序和客户端计算机隔离。

开发安全 WPF 应用程序的最佳方案

生成安全的 WPF 应用程序需要对以下各项应用最佳方案:

请参见

概念

Windows Presentation Foundation 部分信任安全性

Windows Presentation Foundation 安全策略 — 平台安全性

Windows Presentation Foundation 安全策略 — 安全工程

ClickOnce 部署概述

XAML 概述

其他资源

Patterns and Practices Security Guidance for Applications(应用程序的模式和实践安全指南)

代码访问安全性