什么是最简单的WCF/SOAP配置?

4
我们有一个WCF服务,我使用wsHttpBinding进行传输安全和自定义身份验证。
最近我发现默认情况下启用了安全会话(请参见this SO question)。
我很惊讶这样的功能默认就开启了。我原以为默认情况下会得到最简单的配置,并且其他功能都是按需选择的。
我想从最简单的功能集开始,然后决定选择更多的功能。
因此我的问题是:哪些其他功能是默认启用的,我如何关闭它们?

要逐渐适应这样一个事实:微软现在在几乎所有产品中都是“默认安全”的。 - marc_s
如果我的理解是正确的,安全会话并不会使事情更加安全;它只是在安全通道上启用会话。因此,我认为它不符合“默认安全”的原则(在我看来这是一个好的原则)。 - Sylvain
3个回答

5
这要看情况而定 :-)。
你是否想要一个外部可访问的服务,供网络外的用户调用?如果是这样,那么可以使用 basicHttpBinding,它基本上与传统的 ASMX Web 服务相同(SOAP 1.1,非常基本,几乎没有安全性和可靠性特征)。或者一开始就使用 wsHttpBinding(SOAP 1.2,WS-* 等),但首先关闭所有功能。
使用 basicHttpBinding,以后没有太多东西可以“打开”——你有点被卡住了,需要例如切换到 wsHttpBinding 或创建自己的自定义绑定来超越这些基本功能。wsHttpBinding 相当重量级,但大多数像安全性、可靠性等这样的功能可以稍后关闭或重新启用。但并不是每个客户端应用程序都能连接到 wsHttpBinding 终结点。
或者:使用多个终结点!一个使用 basicHttp 的真正简单的终结点供“遗留”客户端使用,一个使用 wsHttpBinding 的更高级的终结点——这就是 WCF 服务的优美之处——你只需编写一次服务代码,并将其公开在无数不同的终结点上,根据客户端的需要!
如果你是内部人员,在公司防火墙内,选择很容易——使用 netTcpBinding——它很快(因为它使用二进制而不是文本编码)并且有很多可以调整的功能。
更新:由于这是一个外部可访问的服务,各种客户端可能会连接,我建议使用带有用户名/密码安全性的 basicHttpBinding。
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsMsgSec">
          <security mode="Message">
            <message clientCredentialType="None" establishSecurityContext="false" negotiateServiceCredential="false"/>
          </security>
          <reliableSession enabled="false"/>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="YourService">
        <endpoint
            address=""
            binding="wsHttpBinding"
            bindingConfiguration="wsMsgSec"
            contract="IYourServiceContract" />
      </service>
    </services>

  </system.serviceModel>

在消息安全标记中,“clientCredentialType”可以使用“UserName”,但这种情况下,您需要设置一些基础设施(例如ASP.NET成员资格提供程序系统)来验证传入的用户名/密码凭据。
此外,一定要查看WCF安全指南,其中详细解释了各种不同安全方案的逐步操作,并说明如何在web.config和WCF配置中进行设置。 (链接)

1
@marc_s:感谢您的回答。这是一个面向外部的服务,所以我需要安全性。我们的客户和合作伙伴直接调用服务。一个配置文件的示例,关闭或将每个特性设置为最小值(除了安全性),会非常有帮助。 - Sylvain
@marc_s:感谢您的更新。您写道:“我会使用basicHttpBinding”,但您的示例是使用wsHttpBinding。我想您的意思是“我会使用basicHttpBinding”。对吗? - Sylvain
哎呀...我犯了同样的错误...我想你是指“我会使用wsHttpBinding”。是这样吗? - Sylvain
您选择将 negotiateServiceCredential 设置为 False。我正在考虑是否应该将其设置为 false(默认情况下为 true,而我使用的是默认值)。我目前使用 clientCredentialType="UserName"。我的理解是,在这种情况下,如果我将 negotiateServiceCredential 设置为 False,则我的客户端在调用我的服务之前必须手动安装我的证书。乍一看,我认为这会使我的服务更难调用。因此,我不认为将 negotiateServiceCredential 设置为 False 有什么好处。我错过了什么吗? - Sylvain
是的,我试图遵循您的“关闭一切”的口号 :-) 但您是正确的 - 这需要在客户端调用实际调用您的服务之前进行带外步骤 - 获取服务证书并正确安装它。 - marc_s

1

wsHttpBinding是一个非常复杂的绑定,用于在其上层叠许多WS-*协议。BasicHttpBinding可能是一个更好的起点-它只是简单的SOAP over HTTP-听起来更像你想要的东西。它非常互操作,但您仍然可以稍后启用许多WS-*行为。


我需要使用自定义身份验证的SOAP over HTTPS。我可以使用basicHttp实现吗? - Sylvain
是的-那正是我们所做的。我们的身份验证功能是作为一种行为构建的,它安装了一个消息检查器来进行验证。 - nitzmahone
@nitzmahone:您的身份验证机制是否可以与任何符合SOAP标准的库直接使用?客户端是否需要有自定义代码来传递凭据给您的应用程序?如果不是,能否请您详细说明一下身份验证过程是如何进行的?非常感谢。 - Sylvain
除了 WS-Security 或 HTTP Basic 之外,SOAP 上的“标准”身份验证并不多。您可以在 basicHttpBinding 上叠加 WS-Security,但您还没有指定您需要什么样的身份验证。大多数 SOAP 包都可以轻松地向所有出站请求添加自定义 SOAP 标头。我们通常两端都是 .NET,所以这对我们来说不太重要(我们确实有相应的客户端行为来进行标头注入)。 - nitzmahone
好的,谢谢提供信息。我想我会继续使用wsHttpBinding。无论如何,我认为我现在已经弄清楚了最小化的WCF wsHttpBinding配置 - 至少在安全设置方面。 - Sylvain

0

wsHttpBinding 的所有可能属性清单都可用 - 您可以浏览它们并根据您的端点要求决定要显式设置哪些属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接