部分信任功能兼容性

在部分受信任的环境中运行时,Windows Communication Foundation (WCF) 支持一个有限的功能子集。部分信任中支持的功能是围绕支持的部署方案主题中所述的一组特定的方案而设计的。

最低权限要求

WCF 在通过以下任一标准命名权限集运行的应用程序中支持一个功能子集:

  • “中等信任”权限
  • “Internet 区域”权限

在部分受信任的应用程序中,如果尝试以受到更多限制的权限来使用 WCF,可能会在运行时导致安全异常。

协定

在部分信任环境下运行时,协定受到以下限制:

  • 实现 [ServiceContract] 接口的服务类必须为 public 类,且必须有一个 public 构造函数。如果该服务类定义 [OperationContract] 方法,则这些方法必须为 public 方法。如果该服务类实现 [ServiceContract] 接口,且 [ServiceContract] 接口为 public 接口,则这些方法实现可以为显式实现或 private 实现。
  • 在使用 [ServiceKnownType] 属性时,指定的方法必须为 public 方法。
  • [MessageContract] 类及其成员可以为 public。如果 [MessageContract] 类是在应用程序程序集中定义的,则该类可以为 internal 类并拥有 internal 成员。

系统提供的绑定

在部分信任环境中完全支持 BasicHttpBindingWebHttpBinding。仅对传输安全模式支持 WSHttpBinding

在部分信任环境中运行时,不支持使用除 HTTP 之外的传输的绑定(例如 NetTcpBindingNetNamedPipeBindingNetMsmqBinding)。

自定义绑定

在部分信任环境中可以创建和使用自定义绑定,但必须遵循本节中指定的限制。

传输

允许的传输绑定元素仅为 HttpTransportBindingElementHttpsTransportBindingElement

编码器

允许以下编码器:

不支持消息传输优化机制 (MTOM) 编码器。

安全性

部分受信任的应用程序可以使用 WCF 的传输级别安全功能来保护其通信。不支持消息级安全。将绑定配置为使用消息级别的安全会在运行时导致异常。

不支持的绑定

不支持使用可靠消息传递、事务或消息级安全的绑定。

序列化

在部分信任环境中支持 DataContractSerializerXmlSerializer。但是,使用 DataContractSerializer 时需要遵循以下条件:

  • 所有可序列化的 [DataContract] 类型必须为 public
  • [DataContract] 类型中的所有可序列化的 [DataMember] 字段或属性必须是公共字段或属性并且可以读取/写入。在部分受信任的应用程序中运行 WCF 时,不支持只读(可能为英文网页)字段的序列化和反序列化。
  • 在部分信任环境中,[Serializable]/ISerializable 编程模型不受支持。
  • 必须在代码或计算机级别配置 (machine.config) 中指定已知类型。出于安全方面的原因,不能在应用程序级配置中指定已知类型。
  • 实现 IObjectReference 的类型在部分受信任的环境中会引发异常。

有关在部分受信任的应用程序中安全使用 DataContractSerializer 的更多安全信息,请参见部分信任最佳实践中的“序列化”一节。

集合类型

一些集合类型可实现 IEnumerableIEnumerable。示例包括实现 ICollection 的类型。这些类型可以实现 GetEnumerator()public 实现和 GetEnumerator() 的显式实现。在此情况下,DataContractSerializer 调用 GetEnumerator()public,而不调用 GetEnumerator() 的显式实现。如果所有 GetEnumerator() 实现都不是 public 而全部是显式实现,则 DataContractSerializer 调用 IEnumerable.GetEnumerator()

对于集合类型,当 WCF 在部分信任环境中运行时,如果 GetEnumerator() 实现都不是 public 或都不是显示接口实现,则引发安全异常。

NetDataContractSerializer

在部分信任环境中,NetDataContractSerializer 不支持许多 .NET Framework 集合类型,如 ListArrayListDictionaryHashtable。这些类型设置了 [Serializable] 属性,如前面“序列化”一节中所述,此属性在部分信任环境中不受支持。DataContractSerializer 以特殊方式处理集合,因而能够避开此限制,NetDataContractSerializer 没有这类机制可避开此限制。

在部分信任环境中,NetDataContractSerializer 不支持 DateTimeOffset 类型。

在部分信任环境中运行时,无法将代理项用于 NetDataContractSerializer(使用 SurrogateSelector 机制)。请注意,此限制适用于使用代理项,而不适用于序列化代理项。

使常见行为能够运行

在部分信任环境中运行应用程序时,如果未标记 AllowPartiallyTrustedCallersAttribute 属性 (APTCA) 的服务行为或终结点行为已添加到配置文件中的 <commonBehaviors> 节,则不会运行这些服务行为或终结点行为。在这种情况下,不会引发任何异常。若要强制运行常见行为,必须执行下列选项之一:

  • 使用 AllowPartiallyTrustedCallersAttribute 属性标记常见行为,以使其在部署为部分信任应用程序时能够运行。请注意,可以在计算机上设置注册表项,以防运行标有 APTCA 的程序集。有关更多信息,请参见 How to: Make APTCA Assemblies Inaccessible to Partially Trusted Code
  • 确保在将应用程序作为完全受信任的应用程序部署时,用户不能修改代码访问安全设置,从而无法在部分信任环境中运行该应用程序。如果用户可以这样做,则不会运行该行为,且不引发任何异常。若要确保这一点,请参见使用Code Access Security Policy Tool (Caspol.exe) 时的 levelfinal 选项。

有关 常见行为的示例,请参见如何:在企业中锁定终结点

配置

除一种例外情况之外,部分受信任的代码只能加载本地 app.config 文件中的 WCF 配置节。要加载引用 machine.config 或根 web.config 文件中的 WCF 节的 WCF 配置节,需要 ConfigurationPermission(Unrestricted)。如果没有此权限,则对本地配置文件之外的 WCF 配置节(行为、绑定)的引用会导致在加载配置时产生异常。

一个例外情况是序列化的已知类型配置,如本主题中的“序列化”一节所述。

诊断

事件日志记录

部分信任环境下支持有限的事件日志记录。事件日志中仅记录服务激活错误和跟踪/消息日志记录错误。为了避免向事件日志写入过多消息,一个进程最多可以记录 5 个事件。

消息日志记录

在部分信任环境中运行 WCF 时,无法进行消息日志记录。如果在部分信任下启用消息日志记录,不会出现服务激活失败,但不记录消息。

跟踪

在部分信任环境中运行时可使用有限的跟踪功能。在配置文件的 <listeners> 元素中,可以添加的类型仅有 TextWriterTraceListener 和新的 EventSchemaTraceListener。使用标准的 XmlWriterTraceListener 可能会造成日志不完整或不正确。

支持的跟踪源有:

不支持下面的跟踪源:

不应指定下面的 TraceOptions 枚举成员:

在部分信任环境中使用跟踪时,应确保应用程序具有足够的权限来存储跟踪侦听器的输出。例如,在使用 TextWriterTraceListener 将跟踪输出写入到文本文件中时,应确保应用程序具有成功写入到跟踪文件中所需的必要的 FileIOPermission。

提示

为了避免重复错误在跟踪文件中造成泛滥,WCF 会在第一次安全失败之后禁用资源或操作跟踪。对于在第一次尝试访问资源或执行操作时出现的每个失败的资源访问,将会有一个异常跟踪。

WCF 服务主机

WCF 服务主机不支持部分信任。如果需要在部分信任环境中使用 WCF 服务,请不要使用 Visual Studio 中的 WCF 服务库项目模板生成服务,而应通过选择 WCF 服务网站模板在 Visual Studio 中创建新的网站,该网站可以在支持 WCF 部分信任的 Web 服务器中承载服务。

其他限制

WCF 通常仅限于由主机应用程序带来的安全注意事项。例如,如果在 XAML 浏览器应用程序 (XBAP) 中承载 WCF,则遵循 XBAP 限制,如 Windows Presentation Foundation 部分信任安全(可能为英文网页)所示。

在部分信任环境中运行 indigo2 时,不启用以下的其他功能:

  • Windows Management Instrumentation (WMI)
  • 事件日志记录仅部分启用(请参见“诊断”一节的讨论)。
  • 性能计数器

使用在部分信任环境中不支持 WCF 功能可能会导致在运行时产生异常。

未列出的功能

若要在部分信任环境中运行时发现不可用的信息或操作,最好的方法是尝试在 try 块的内部访问资源或执行操作,然后 catch 失败。为了避免重复错误在跟踪文件中造成泛滥,WCF 会在第一次安全失败之后禁用资源或操作跟踪。对于在第一次尝试访问资源或执行操作时出现的每个失败的资源访问,将会有一个异常跟踪。

另请参见

参考

HttpTransportBindingElement
HttpsTransportBindingElement
TextMessageEncodingBindingElement
WebMessageEncodingBindingElement

概念

支持的部署方案
部分信任最佳实践