部分信任功能兼容性
在部分受信任的环境中运行时,Windows Communication Foundation (WCF) 支持一个有限的功能子集。 部分信任中支持的功能围绕 Supported Deployment Scenarios 主题中所述的一组特定的方案而设计。
最低权限要求
WCF 在通过以下任一标准命名权限集运行的应用程序中支持一个功能子集:
“中等信任”权限
“Internet 区域”权限
尝试在部分受信任的应用程序中使用 WCF,其权限限制较多,可能会在运行时导致安全异常。
协定
在部分信任环境下运行时,协定受到以下限制:
实现
[ServiceContract]
接口的服务类必须为public
类,且必须有一个public
构造函数。 如果该服务类定义[OperationContract]
方法,则这些方法必须为public
方法。 如果该服务类实现[ServiceContract]
接口,且private
接口为[ServiceContract]
接口,则这些方法实现可以为显式实现或public
实现。在使用
[ServiceKnownType]
属性时,指定的方法必须为public
方法。[MessageContract]
类及其成员可以为public
。 如果[MessageContract]
类是在应用程序程序集中定义的,则该类可以为internal
类并拥有internal
成员。
系统提供的绑定
在部分信任环境中完全支持 BasicHttpBinding 和 WebHttpBinding 。 仅对传输安全模式支持 WSHttpBinding 。
在部分信任环境中运行时,不支持使用除 HTTP 之外的传输的绑定(例如 NetTcpBinding、 NetNamedPipeBinding或 NetMsmqBinding)。
自定义绑定
在部分信任环境中可以创建和使用自定义绑定,但必须遵循本节中指定的限制。
传输
允许的传输绑定元素仅为 HttpTransportBindingElement 和 HttpsTransportBindingElement。
编码器
允许以下编码器:
文本编码器 (TextMessageEncodingBindingElement)。
二进制编码器 (BinaryMessageEncodingBindingElement)。
Web 消息编码器 (WebMessageEncodingBindingElement)。
不支持消息传输优化机制 (MTOM) 编码器。
安全性
部分受信任的应用程序可以使用 WCF 的传输级别安全功能来保护其通信。 不支持消息级安全。 如果将绑定配置为使用消息级别的安全性,会在运行时导致异常。
不支持的绑定
不支持使用可靠消息传递、事务或消息级安全的绑定。
序列化
在部分信任环境中支持 DataContractSerializer 和 XmlSerializer 。 但是,使用 DataContractSerializer 时需要遵循以下条件:
所有可序列化的
[DataContract]
类型必须为public
。[DataMember]
类型中的所有可序列化的[DataContract]
字段或属性必须是公共字段或属性并且可以读取/写入。 在部分受信任的应用程序中运行 WCF 时,不支持readonly
字段的序列化和反序列化。在部分信任环境中,
[Serializable]
/ISerializable 编程模型不受支持。必须在代码或计算机级别配置 (machine.config) 中指定已知类型。 出于安全方面的原因,不能在应用程序级配置中指定已知类型。
实现 IObjectReference 的类型在部分受信任的环境中会引发异常。
有关在部分受信任的应用程序中安全使用 DataContractSerializer 的更多安全信息,请参见部分信任最佳实践中的“序列化”一节。
集合类型
一些集合类型可实现 IEnumerable<T> 和 IEnumerable。 示例包括实现 ICollection<T>的类型。 这些类型可以实现 public
的 GetEnumerator()
实现和 GetEnumerator()
的显式实现。 在此情况下, DataContractSerializer 调用 public
的 GetEnumerator()
,而不调用 GetEnumerator()
的显式实现。 如果所有 GetEnumerator()
实现都不是 public
而全部是显式实现,则 DataContractSerializer 调用 IEnumerable.GetEnumerator()
。
对于集合类型,当 WCF 在部分信任环境中运行时,如果所有 GetEnumerator()
实现都不是 public
,或者都不是显式接口实现,则会引发安全异常。
NetDataContractSerializer
在部分信任环境中, List<T>不支持许多 .NET Framework 集合类型,如 ArrayList、 Dictionary<TKey,TValue> 、 Hashtable 和 NetDataContractSerializer 。 这些类型设置了 [Serializable]
属性,如前面“序列化”一节中所述,此属性在部分信任环境中不受支持。 DataContractSerializer 以特殊方式处理集合,因而能够避开此限制, NetDataContractSerializer 没有这类机制可避开此限制。
在部分信任环境中, DateTimeOffset 不支持 NetDataContractSerializer 类型。
在部分信任环境中运行时,无法将代理项用于 NetDataContractSerializer (使用 SurrogateSelector 机制)。 请注意,此限制适用于使用代理项,而不适用于序列化代理项。
使常见行为能够运行
在部分信任环境中运行应用程序时,如果未标记 AllowPartiallyTrustedCallersAttribute 属性 (APTCA) 的服务行为或终结点行为已添加到配置文件中的 <commonBehaviors> 节,则不会运行这些服务行为或终结点行为。在这种情况下,不会引发任何异常。 若要强制运行常见行为,必须执行下列选项之一:
使用 AllowPartiallyTrustedCallersAttribute 属性标记常见行为,以使其在部署为部分信任应用程序时能够运行。 请注意,可以在计算机上设置注册表项,以防运行标有 APTCA 的程序集。 。
确保在将应用程序作为完全受信任的应用程序部署时,用户不能修改代码访问安全设置,从而无法在部分信任环境中运行该应用程序。 如果用户可以这样做,则不会运行该行为,且不引发任何异常。 若要确保这一点,请使用 Caspol.exe(代码访问安全性策略工具)查看 levelfinal 选项。
有关常见行为的示例,请参阅如何:在企业中锁定终结点。
配置
除一种例外情况之外,部分受信任的代码只能加载本地 app.config
文件中的 WCF 配置节。 要加载引用了 machine.config 或根 web.config 文件中的 WCF 节的 WCF 配置节,需要 ConfigurationPermission(Unrestricted)。 如果没有此权限,对本地配置文件之外的 WCF 配置节(行为、绑定)的引用会导致在加载配置时产生异常。
一个例外情况是序列化的已知类型配置,如本主题中的“序列化”一节所述。
重要
仅当在完全信任环境下运行时,才支持配置扩展。
诊断
事件日志记录
部分信任环境下支持有限的事件日志记录。 事件日志中仅记录服务激活错误和跟踪/消息日志记录错误。 为了避免向事件日志写入过多消息,一个进程最多可以记录 5 个事件。
消息日志记录
在部分信任环境中运行 WCF 时,无法进行消息日志记录。 如果在部分信任下启用消息日志记录,不会出现服务激活失败,但不记录消息。
跟踪
在部分信任环境中运行时可使用有限的跟踪功能。 在配置文件的 <listeners>
元素中,可以添加的类型仅有 TextWriterTraceListener 和新的 EventSchemaTraceListener。 使用标准的 XmlWriterTraceListener 可能会造成日志不完整或不正确。
支持的跟踪源有:
System.IdentityModel.Claims、System.IdentityModel.Policy、System.IdentityModel.Selectors 和 System.IdentityModel.Tokens。
不支持下面的跟踪源:
不应指定下面的 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 管理规范 (WMI)
事件日志记录仅部分启用(请参见“ 诊断 ”一节的讨论)。
性能计数器
使用在部分信任环境中不支持 WCF 功能可能会导致在运行时产生异常。
未列出的功能
若要在部分信任环境中运行时发现不可用的信息或操作,最好的方法是尝试在 try
块的内部访问资源或执行操作,然后 catch
失败。 为了避免重复错误在跟踪文件中造成泛滥,WCF 会在第一次安全失败之后禁用资源或操作跟踪。 对于在第一次尝试访问资源或执行操作时出现的每个失败的资源访问,将会有一个异常跟踪。