c# - WCF 为绑定(bind)设置保护级别?

标签 c# wcf security soap

在WCF中,ProtectionLevel是一个比较重要的概念。保护级别控制如何/是否对消息进行加密和签名。

据我所知,设置保护级别的唯一方法是将属性应用于代码,并且可用于设置属性的最广泛范围是在服务上使用 ServiceContract 属性合约接口(interface)。

例如,您将服务契约(Contract)接口(interface)代码分发给第三方的情况。 IE。您向第三方提供一个 *.cs 文件,其中包含:

// inside this attribute is where you put ProtectionLevel = ...
[ServiceContract(Namespace = "some:name:space")]
public interface IMyService
{
    [OperationContract(Action = "...", ReplyAction = "...")]
    Message MyOperation(Message request);
}

现在假设有人想在各种场景中使用这个服务契约。在一种情况下,用户希望使用签名消息(无加密)进行通信。在另一种情况下,用户需要签名和加密。

现在,如果我理解正确的话,用户将需要两份服务契约(Contract),一份保护级别为 Sign,一份保护级别为 SignAndEncrypt

对我来说,这种设计似乎有点奇怪:毕竟,大多数 WCF 安全设置都是在绑定(bind)级别配置的(通过 .config 文件或代码)。

我的问题:

  • 为什么不能直接在绑定(bind)上设置保护级别? (或比服务契约(Contract)范围更广的其他范围)
  • 或者也许这是可能的?如果是,怎么做?

一些文档链接:

最佳答案

Why is it not possible to set the protection level directly on the binding? (or some other scope wider than the service contract scope)

在代码中指定保护级别是服务开发人员可以指示整个服务或服务上的某些操作需要最低安全级别的机制。保护级别本身不提供任何安全性。

绑定(bind)通过提供消息级加密和/或传输级加密来提供实际的安全性,具体取决于绑定(bind)。

通过绑定(bind)配置实例(在代码或配置中定义),在服务契约范围内应用绑定(bind)。当绑定(bind)配置实例启用了消息级加密时,它将查询服务契约(Contract)以查看开发人员是否已指示所需的任何最低保护级别。如果它找到指定的保护级别,那么它最好应用指定的安全级别。请注意,根据所选的绑定(bind),这可能是不可能的。

Now imagine someone wants to use this service contract in various scenarios. In one case, the user wants to communicate using signed messages (no encryption). In the other case, the user wants both signing and encryption.

Now if I understand correctly, the user would then need TWO service contracts, one with protection level Sign, and one with protection level SignAndEncrypt.

这是不正确的。如果绑定(bind)配置实例启用了消息级别的安全性,并且它没有找到服务契约中定义的任何保护级别,那么它将默认通过消息加密来保护所有服务的通信。如果绑定(bind)配置实例没有启用消息级安全性,则不会。所以你不需要两个服务契约(Contract),只需要两个绑定(bind)配置实例。

关于c# - WCF 为绑定(bind)设置保护级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42505977/

相关文章:

c# - 在 View 中显示字符串?

c# - 我在 Entitlement plist 中为我的移动应用程序添加了钥匙串(keychain)支持但无法在 xamarin 中准备发布版本

c# - WCF 中的错误处理 - 如何将错误传递给客户端以及将 channel 保持在 "Open"状态

c# - 防止 WCF 暴露我的整个类(class)?

asp.net - 在 IIS 7.5 中联系 WCF 服务时,对等方 (502) 重置连接

c# - 如果 C# 代码是 JIT 编译的,为什么我在构建时必须在 Visual Studio 中选择一个目标平台?

c# - WCF 服务不喜欢单引号

java - Java EE 安全模型是否支持 ACL?

security - 将 Google API 凭据存储在数据库中。安全吗?

asp.net - 控制哪些 WebMethod 在 WebService 中对外公开