代码之家  ›  专栏  ›  技术社区  ›  Jeff Bramwell

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

  •  0
  • Jeff Bramwell  · 技术社区  · 16 年前

    我们目前支持在负载平衡环境中运行的几个WCF服务。过去,我们用 WSHTPTP-绑定 并设置 建立安全上下文 到 假 允许服务与我们的负载均衡器正常工作。

    我们遇到的一个问题是 WSHTPTP-绑定 默认情况下加密返回结果,显然无法关闭。这导致了 Riverbed 我们在网络上使用的压缩设备——也就是说,加密的数据压缩得不太好(或者根本不好)。

    现在我们正试图利用 basichttpbinding 因为默认情况下它不加密数据。我们有两个要求:

    1. 使用负载平衡器 -这可能是通过使用 保持不变 错了。这需要使用自定义绑定。例如:

      <customBinding>  
        <binding name="NewBinding0">  
          <httpTransport authenticationScheme="Ntlm" **keepAliveEnabled="false"** />  
        </binding>  
      </customBinding>  
      
    2. 传递用户凭据 -将安全模式设置为 必要的运输 . 这个有 basichttpbinding . 例如:

      <basicHttpBinding>  
        <binding name="NewBinding1">  
          <security **mode="TransportCredentialOnly"** />  
        </binding>  
      </basicHttpBinding>  
      

    所以现在我要问的是:-)…如何/是否可以将上述两个需求组合成一个自定义绑定?相当于什么 α2 上面的自定义绑定?如何让它通过用户凭据?

    谢谢!

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jeff Bramwell    16 年前

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

    <customBinding>
     <binding name="NewBinding0">
     <httpTransport authenticationScheme="Ntlm" keepAliveEnabled="false" />
     </binding>
    </customBinding>
    

    然后,在客户端,我可以使用以下代码获取运行WCF服务的应用程序池(在IIS中)的标识,以及实际调用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,并且一切似乎都运行良好。测试在负载平衡的环境中模拟100个用户的负载10分钟。我们在测试期间关闭了其中一个负载平衡服务器,并且一切都按预期继续运行(即测试期间没有抛出异常,也没有任何标识返回错误)。

    上面的代码是关键部分,对于需求2,我丢失了-也就是说,直到这项研究,我才意识到WCF会给你多重身份。

    此外,使用此配置,WCF调用的结果不会加密(这是我们想要的)。所以,我认为这种配置对我们的情况很有效。

    推荐文章