我有一个使用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多重标记的用户帐户下运行的服务进行身份验证。
如何通过负载均衡器调用我的服务?
答案 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
查看setspn
的文档