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 中的每个成员所需的权限。此外,以下功能含有关于部分信任执行的详细信息,其中包括特殊注意事项:
Web Services(使用 Windows Communication Foundation)(请参见部分信任)。
XAML(请参见 XAML 概述)。
拖放(请参见拖放概述)。
剪贴板(请参见 System.Windows.Clipboard)。
图像处理(请参见 System.Windows.Controls.Image)。
序列化(请参见 XamlReader.Load 和 XamlWriter.Save)。
“打开文件”对话框(请参见 Microsoft.Win32.OpenFileDialog)。
下表概括了不能在 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 功能更改。 |