Windows Presentation Foundation 部分信任安全性

更新: 2008 年 7 月

通常,应该限制 Internet 应用程序直接访问关键系统资源,防止恶意损坏。默认情况下,HTML 和客户端脚本语言无法访问关键系统资源。因为以 Windows Presentation Foundation (WPF) 浏览器为宿主的应用程序可以从该浏览器中启动,所以它们应该符合一组类似的限制。为了实施这些限制,WPF 同时依赖于 代码访问安全性 (CAS) 和 ClickOnce(请参见 Windows Presentation Foundation 安全策略 — 平台安全性)。默认情况下,以浏览器为宿主的应用程序请求 Internet 区域 CAS 权限集,而无论它们是从 Internet、本地 Intranet 还是本地计算机中启动的。如果应用程序的运行权限小于完全权限集,那么就说该应用程序正在部分信任环境下运行。

WPF 提供了各种各样的支持,确保可以在部分信任环境中安全地使用尽可能多的功能;还与 CAS 一起为部分信任编程提供了附加支持。

本主题包括下列各节。

  • WPF 功能部分信任支持
  • 部分信任编程
  • 管理权限
  • 相关主题

WPF 功能部分信任支持

下表列出了可以在 Internet 区域权限集限制范围内安全使用的 Windows Presentation Foundation (WPF) 高级功能。

表 1:在部分信任环境中安全的 WPF 功能

功能区域

功能

常规

浏览器窗口

源站点访问

IsolatedStorage(512KB 限制)

UIAutomation 提供程序

命令

输入法编辑器 (IME)

Tablet 手写笔和墨迹

使用 Mouse Capture 和 Move 事件模拟的拖放

OpenFileDialog

XAML 反序列化(通过 XamlReader.Load)

Web 集成

“浏览器下载”对话框

顶级用户启动的导航

mailto:links

统一资源标识符参数

HTTPWebRequest

IFRAME 中承载的 WPF 内容

使用框架承载同一站点 HTML 页

使用 WebBrowser 承载同一站点 HTML 页

Web Services (ASMX)

Web Services(使用 Windows Communication Foundation)

视觉效果

二维和三维

动画

媒体(源站点和跨域)

图像处理/音频/视频

阅读

FlowDocuments

XPS 文档

嵌入式字体与系统字体

CFF 字体与 TrueType 字体

编辑

拼写检查

RichTextBox

纯文本和墨迹剪贴板支持

用户启动的粘贴

复制选定内容

控件

常规控件

此表包括了高级 WPF 功能。有关更多详细信息,请参见 Windows 软件开发工具包 (SDK) 文档,其中介绍了 WPF 中的每个成员所需的权限。此外,以下功能含有关于部分信任执行的详细信息,其中包括特殊注意事项:

下表概括了不能在 Internet 区域权限集限制范围内安全运行的 WPF 功能:

表 2:在部分信任环境中不安全的 WPF 功能

功能区域

功能

常规

窗口(应用程序定义的窗口和对话框)

SaveFileDialog

文件系统

注册表访问

拖放

XAML 序列化(通过 XamlWriter.Save)

UIAutomation 客户端

源窗口访问 (HwndHost)

完全语音支持

Windows 窗体互操作性

Web 集成

脚本

文档对象模型

视觉效果

位图效果

图像编码

编辑

RTF 格式剪贴板

完全 XAML 支持

部分信任编程

对于 XBAP 应用程序,超出默认 Internet 区域权限集的代码将被 CAS 检测出来,并将导致引发安全异常和应用程序结束。尽管这保护了用户,但不能提供最佳用户体验。

通常,超出允许权限的代码可能是在独立应用程序和以浏览器为宿主的应用程序之间共享的公用代码。CAS 和 WPF 提供了几个用于管理此方案的技巧。

使用 CAS 检测权限

在一些情况下,独立应用程序和 XBAP 可能同时使用库程序集中的共享代码。这时,代码执行的功能所需要的权限可能超出应用程序的授权权限集允许的权限。通过使用 Microsoft .NET Framework 安全性,应用程序可以检测它是否具有某个权限。具体来说,它可以通过在所需权限的实例上调用 Demand 方法来测试它是否具有特定权限。以下示例对此进行了演示,该示例中的代码查询它是否能够将文件保存到本地磁盘:

如果应用程序不具有所需的权限,则对 Demand 的调用将引发安全异常。如果没有引发异常,则表示已授予该权限。IsPermissionGranted 封装了这一行为,并且根据情况返回 true 或 false。

功能下降

对于可以从不同区域执行的代码而言,能够检测代码是否具有完成所需操作的权限是很有意义的。能够检测区域固然不错,但如果能够为用户提供替代方法,则要好得多。例如,完全信任应用程序通常使用户能够在他们希望的任何地方创建文件,而部分信任应用程序只能在独立存储中创建文件。如果用于创建文件的代码存在于由完全信任(独立应用程序)和部分信任(以浏览器为宿主的应用程序)共享的程序集 (.dll) 中,并且这两个应用程序都希望用户能够创建文件,则共享代码应该首先检测它是在部分信任环境还是完全信任环境中运行,然后才能在适当的位置创建文件。下面的代码对这两种情况进行了演示:

在很多情况下,应该能够找到部分信任替代方法。

在受控环境(例如 Intranet)中,可以将自定义托管框架安装到整个客户端群的 全局程序集缓存 (GAC) 中。这些库可以执行需要完全信任的代码,并且可以通过使用 AllowPartiallyTrustedCallersAttribute 从只被授予部分信任的应用程序中引用(有关更多信息,请参见 Windows Presentation Foundation 安全性Windows Presentation Foundation 安全策略 — 平台安全性)。

浏览器宿主检测

在需要按权限进行检查时,使用 CAS 检查是否具有权限是一种恰当的方法。然而,这一技巧依赖于在正常处理过程中捕获异常(通常不鼓励这样做),并且可能导致性能问题。如果 XAML 浏览器应用程序 (XBAP) 只在 Internet 区域沙盒内运行,则可以改为使用 BrowserInteropHelper.IsBrowserHosted(它为 XAML 浏览器应用程序 (XBAP) 返回 true)。

请参见“检测是否由浏览器承载”示例

说明:

IsBrowserHosted 只区分应用程序是否在浏览器中运行,而不区分应用程序正在通过哪个权限集运行。

管理权限

默认情况下,XBAP 在部分信任环境(默认 Internet 区域权限集)下运行。但是,根据应用程序的要求,可以更改默认的权限集。例如,如果 XBAP 是从本地 Intranet 启动的,则可以利用增强的权限集,如下表所示。

表 3:LocalIntranet 和 Internet 权限

权限

属性

LocalIntranet

Internet

DNS

访问 DNS 服务器

环境变量

读取

文件对话框

打开

文件对话框

无限制

独立存储

按用户隔离程序集

独立存储

未知隔离

独立存储

无限制用户配额

媒体

安全音频、视频和图像

打印

默认打印

打印

安全打印

反射

发出

安全性

托管代码执行

安全性

声明授予的权限

用户界面

无限制

用户界面

安全顶级窗口

用户界面

自己的剪贴板

Web 浏览器

HTML 中的安全框架导航

如果需要增加权限,可以使用下列工具之一:

如果 XBAP 需要完全信任,则可以使用相同的工具来增加请求的权限,不过 XBAP 只有在本地计算机上安装和启动时才会收到完全信任。这意味着不能保留在将 XBAP 发布到 Web 服务器时获得的自动更新支持。

请参见

概念

Windows Presentation Foundation 安全性

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

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

修订记录

日期

修订记录

原因

2008 年 7 月

增加了对新 WebBrowser 控件的描述。

SP1 功能更改。