【问题标题】:WCF set protection level for binding?WCF为绑定设置保护级别?
【发布时间】:2017-02-28 10:18:02
【问题描述】:

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

据我了解,设置保护级别的唯一方法是对代码应用属性,可用于设置属性的最广泛范围是使用服务合约接口上的ServiceContract 属性。

例如,您将服务合同接口代码分发给第三方的情况。 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);
}

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

现在,如果我理解正确,用户将需要两份服务合同,一份保护级别为Sign,一份保护级别为SignAndEncrypt

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

我的问题:

  • 为什么不能直接在绑定上设置保护级别? (或比服务合同范围更广的其他范围)
  • 或许有可能?如果有,怎么做?

一些文档链接:

【问题讨论】:

    标签: c# wcf security soap


    【解决方案1】:

    为什么不能直接设置保护级别 捆绑? (或比服务合同范围更广的其他范围)

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

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

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

    现在假设有人想在各种情况下使用此服务合同 情景。在一种情况下,用户希望使用签名进行通信 消息(无加密)。在另一种情况下,用户想要两者 签名和加密。

    现在,如果我理解正确,用户将需要两项服务 合同,一份带有保护等级标志,一份带有保护 级别SignAndEncrypt。

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

    【讨论】:

    • 好的,我想我明白了。但是想象一下这种情况: a) 消息安全 b) 单个服务合同 c) 我想使用签名和加密调用服务一 d) 我想仅使用签名调用服务二 我将如何指定 c) 和 d) 之间的区别?
    • @codeape - 我想我应该正确阅读您的问题。在这种情况下,是的,你是对的。对于您的特定情况,除非您有两个不同的服务合同,否则没有办法。但是,我会大胆猜测这纯粹是人为的场景,而不是您所面临的实际场景?
    • 是的,你是对的,这是我试图理解 WCF。我不断调整绑定配置并查看提琴手中的请求和响应。您对 WCF 博客、书籍或其他深入了解事物实际工作方式的资源有什么建议吗? IMO,WCF 文档太高级了。
    • @codeape - 听起来你正在做的是一个好方法。关于 WCF 有很多神话。 Juval Lowy 在 WCF 上的任何内容都适合阅读。他是后来成为 WCF 的 Indigo 的主要参与者之一。
    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多