正在寻找WCF解决方案,以便在具有自定义绑定的负载平衡环境中传递用户凭据

正在寻找WCF解决方案,以便在具有自定义绑定的负载平衡环境中传递用户凭据,wcf,wcf-binding,wcf-security,Wcf,Wcf Binding,Wcf Security,我们目前支持在负载平衡环境中运行的多个WCF服务。在过去,我们使用wsHttpBinding并将establishSecurityContext设置为false,以允许服务与负载平衡器正常工作 我们遇到的一个问题是wsHttpBinding在默认情况下对返回结果进行加密,而且显然无法关闭。这会导致我们网络上的压缩设备出现问题,即加密数据不能很好地压缩或根本不能压缩 现在我们尝试使用basicHttpBinding,因为默认情况下它不会加密数据。我们有两个要求: 使用负载平衡器-这可能是通过将ke

我们目前支持在负载平衡环境中运行的多个WCF服务。在过去,我们使用wsHttpBinding并将establishSecurityContext设置为false,以允许服务与负载平衡器正常工作

我们遇到的一个问题是wsHttpBinding在默认情况下对返回结果进行加密,而且显然无法关闭。这会导致我们网络上的压缩设备出现问题,即加密数据不能很好地压缩或根本不能压缩

现在我们尝试使用basicHttpBinding,因为默认情况下它不会加密数据。我们有两个要求:

使用负载平衡器-这可能是通过将keepAliveEnabled设置为false实现的。这需要使用自定义绑定。例如:

<customBinding>  
  <binding name="NewBinding0">  
    <httpTransport authenticationScheme="Ntlm" **keepAliveEnabled="false"** />  
  </binding>  
</customBinding>  
<basicHttpBinding>  
  <binding name="NewBinding1">  
    <security **mode="TransportCredentialOnly"** />  
  </binding>  
</basicHttpBinding>  
传递用户凭据-这似乎可以通过将安全模式设置为TransportCredentialOnly来实现。这在basicHttpBinding中可用。例如:

<customBinding>  
  <binding name="NewBinding0">  
    <httpTransport authenticationScheme="Ntlm" **keepAliveEnabled="false"** />  
  </binding>  
</customBinding>  
<basicHttpBinding>  
  <binding name="NewBinding1">  
    <security **mode="TransportCredentialOnly"** />  
  </binding>  
</basicHttpBinding>  
现在我要问的问题是:-。。。如何/有可能将上述两个需求组合成一个定制绑定?对于自定义绑定,上面2的等效值是什么?我如何让它通过用户凭据


谢谢

事实证明,使用以下绑定配置,我可以对自定义绑定执行我想要的操作:

<customBinding>
 <binding name="NewBinding0">
 <httpTransport authenticationScheme="Ntlm" keepAliveEnabled="false" />
 </binding>
</customBinding>
然后,在客户端,我可以使用以下代码获取IIS中运行WCF服务的应用程序池的标识以及实际调用WCF服务的用户的标识:

public string GetData(int value)
{
  var callingUser = string.Empty;
  var appPoolUser = WindowsIdentity.GetCurrent().Name;
  var identities =
    OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties["Identities"] as
    IList<IIdentity>;

  if (identities != null)
  {
    var result = from i in identities
            where i.AuthenticationType == "NTLM"
            select new { i.Name };

    if (result.Count() > 0)
    {
      callingUser = result.First().Name;
    }

  }

  return string.Format("Value Entered: {0}; AppPool User: {1}; Calling User: {2}", value,
          appPoolUser, callingUser);
}
我在一个负载平衡的环境中测试了上面的代码(针对需求1),一切都运行得很好。这些测试在负载平衡的环境中模拟了10分钟的100个用户负载。在测试过程中,我们关闭了一台负载平衡服务器,一切都按预期运行,即测试过程中没有抛出异常,也没有错误地返回任何标识

上面的代码是我所缺少的需求2的关键部分,也就是说,直到这项研究,我才意识到WCF会给你多重身份

此外,使用此配置,WCF调用的结果不会加密,这正是我们想要的。因此,我认为这种配置将适合我们的情况