如何通过负载均衡器将wsHttpBinding与Message安全性一起使用

时间:2017-06-28 20:10:34

标签: wcf load-balancing wshttpbinding

我有一个使用Message安全性的负载均衡服务:

<wsHttpBinding>
  <binding>
    <security mode="Message">
      <message clientCredentialType="Windows" establishSecurityContext="false" />
    </security>
  </binding>
</wsHttpBinding>

我对此服务的所有调用都会打开和关闭自己的频道,因此建立安全上下文没有任何好处。

我使用与服务配置匹配的WSHttpBinding来调用服务:

ws.Security.Mode = SecurityMode.Message;
ws.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
ws.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
ws.Security.Message.EstablishSecurityContext = false;

这有时会起作用,但有时会出现错误,例如

  

安全上下文令牌已过期或无效。邮件未被处理。

  

安全令牌请求包含无效或格式错误的元素。

我终于找到了setting EstablishSecurityContext to false doesn't actually prevent security context tokens from being used。我们的负载均衡器目前不使用粘性会话,我正试图避免走那条路。

我确实发现我应该set NegotiateServiceCredential to false on the client to allow for the load balancer without sticky sessions。我的服务已在AD帐户下运行,我可以在WSDL中看到它:

<Upn>User@Domain</Upn>

但是,当我尝试将服务标识添加到我的客户端时

EndpointIDentity.CreateUpnIdentity("User@Domain")

我收到以下错误:

  

不支持对在需要Kerberos多重标记的用户帐户下运行的服务进行身份验证。

如何通过负载均衡器调用我的服务?

1 个答案:

答案 0 :(得分:1)

根据NegotiateServiceCredential的文档,您必须使用SPN标识而不是UPN运行服务:

  

如果此属性设置为false,并且绑定配置为使用   Windows作为客户端凭据类型,服务帐户必须是   与服务主体名称(SPN)相关联。要做到这一点,运行   NETWORK SERVICE帐户或LOCAL SYSTEM帐户下的服务。   或者,使用SetSpn.exe工具为。创建SPN   服务帐户。在任何一种情况下,客户端都必须使用正确的SPN   在&lt; servicePrincipalName&gt;中元素,或使用EndpointAddress   构造

配置运行服务的SPN后,您的WSDL应显示SPN而不是UPN,然后您必须修改您的客户端,以便:EndpointIdentity.CreateSpnIdentity("service_spn_name")

更新

以下命令应正确配置SPN:

setspn -A YourSvc/host.server.com domain\AppPoolAcccountName

  • YourSvc =标识您的svc的名称
  • host.server.com =您的服务托管服务器的完全限定主机名

查看setspn

的文档