我们有一个 WCF 服务,我将 wsHttpBinding 与传输安全和自定义身份验证一起使用。
我最近发现默认情况下安全 session 是开启的(见 this SO question)。
我很惊讶默认情况下启用了这样的功能。我认为默认情况下我会得到最简单的配置,并且附加功能将基于选择加入。
我想从最简单的功能集开始,然后决定选择加入更多功能。
所以我的问题是:默认启用的其他功能是什么,我该如何关闭它们?
最佳答案
这取决于:-) 像往常一样。
您想拥有一个面向外部的服务,网络外部的用户可以调用它吗?如果是这样,则使用 basicHttpBinding
这与传统的 ASMX Web 服务基本相同(SOAP 1.1,非常基础,几乎没有任何安全性和可靠性功能)。或使用 wsHttpBinding
(SOAP 1.2,WS-* 的东西)从一开始,但首先关闭所有功能。
有了 basicHttpBinding,以后就没有太多要“打开”的东西了——你有点卡住了,需要例如切换到 wsHttpBinding 或在基本功能之外创建您自己的自定义绑定(bind)。 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 Security Guidance它对大量不同的安全场景进行了分步解释,以及在 web.config 和 WCF 配置中为每个场景执行的操作。
关于wcf - 什么是最简单的 WCF/SOAP 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1718810/