使用wsHttpBinding和Message Security与客户端凭据类型窗口负载平衡WCF

Bra*_*o11 7 c# wcf ws-security load-balancing wcf-security

我们有一个普通的WCF服务,其绑定看起来像这样:

 <wsHttpBinding>
 <binding name="ServiceBinding" receiveTimeout="00:10:00" sendTimeout="00:10:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxReceivedMessageSize="20971520"
                messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">                   
                <security mode="Message">
                      <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        establishSecurityContext="false" />
                </security>
            </binding>
</wsHttpBinding>
Run Code Online (Sandbox Code Playgroud)

此服务位于负载均衡器后面的2台服务器中.如此处所示

http://msdn.microsoft.com/en-us/library/vstudio/hh273122(v=vs.100).aspx

我已将establishSecurityContext设置为false.当我运行调用服务时,我得到与无效安全上下文令牌相关的间歇性问题.即使我说不要建立SeurityContext,似乎WCF正在做所有正常的握手事情.

此时使用Cert,BasicHttBinding或由于要求不允许安全性.

我甚至让基础架构团队在负载均衡器中启用粘性会话,但似乎没有任何东西像我们期望的那样工作.

我和我的团队几乎完成了互联网上所说的一切,但是当有负载均衡器时似乎没有任何工作,并且当没有负载均衡器时这种绑定工作正常.

这个绑定有没有运气好吗?

我们正在追逐微软向我们发送WCF专家,但显然人们很难掌握.

如何让这个东西与Load Balancer很好地配合?

Iva*_*gin 7

你设置negotiateServiceCredential ="true".这意味着在初始交换期间会创建安全上下文,但此上下文不会在后续调用中使用(因为establishSecurityContext ="false").协商过程允许客户端安全地获取服务器凭据.然后,客户端使用这些凭据来保护消息.这就是所有"握手的东西"发生的原因.

本文描述了此方案:"使用Windows客户端的邮件安全性".

当您使用负载均衡器时需要进行安全协商(因为实际服务器的凭据取决于将为请求提供服务的计算机),除非您对平衡器后面的所有服务实例使用相同的凭据.在后一种情况下,您可以设置negotiateServiceCredential ="false"并在配置或代码中指定服务器凭据.例如,您可以使用clientCredentialType ="Certificate"并为所有计算机使用相同的服务器证书.或者你可以clientCredentialType ="Windows"并将任意SPN配置给域用户,域用户用于运行平衡器后面的所有服务(我没有尝试这种情况,请参阅下面的详细信息).

在你的情况下,negotiateServiceCredential ="true".所以可能的问题是:

1)粘性会话可能无法正常工作.您可以通过使用返回的BasicHttBinding实现简单的WCF服务来测试它

String.Format("{0}{1}", prefix, DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

在平衡器后面的一台服务器上的app设置中配置prefix ="",前缀="!!!!!!!!!!!!" 另外一个.然后多次循环调用此服务并记录结果.您将看到粘性会话是否存在问题.

2)如果粘性会话正常工作,请确保在不使用平衡时,您的配置适用于所有服务器.

如果无法使用粘性会话,则应设置negotiateServiceCredential ="false".未使用协商,因此客户端应在代码或配置中显式配置服务器凭据.要在不进行协商的情况下使用Windows凭据类型,服务的用户帐户必须能够访问向Active Directory域注册的服务主体名称(SPN).请参阅"使用没有凭据协商的Windows客户端的邮件安全性"中的详细信息和示例

要使用任意SPN,您应将服务配置为在同一Windows域帐户下运行.要将任意SPN设置为帐户,您可以在域控制器上使用setspn实用程序:

setspn a AcmeService/GlobalBank WS_Account
Run Code Online (Sandbox Code Playgroud)

Kerberos Technical Supplement for Windows中所述

有关各种方案和相应设置的说明,另请参阅有关Message Security的文章.