首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在负载平衡(AWS)中使用WCF时,安全上下文令牌无效

在负载平衡(AWS)中使用WCF时,安全上下文令牌无效
EN

Stack Overflow用户
提问于 2014-08-23 17:23:45
回答 2查看 14K关注 0票数 4

我有一个托管在AWS上的WCF应用程序。为了获得更高的可用性,我创建了WCF机器的快照,并使用此映像启动了另一个实例。

此外,我还创建了一个弹性负载平衡(ELB),用于将请求路由到这两个服务器。

使用我的WCF客户端,如果我使用机器公共IP地址,我可以成功地连接两个服务器。,但是如果我使用ELB主机名,我的连接就会因以下错误而失败:

System.ServiceModel.FaultException:无法处理消息。这很可能是因为操作“http://tempuri.org/IService/GetCustomerData”不正确,或者消息包含无效或过期的安全上下文令牌,或者因为绑定之间存在不匹配。如果服务由于不活动而中止通道,则安全上下文令牌将无效。为了防止服务过早中止空闲会话,增加服务端点绑定的接收超时时间。

此错误表示我有一个无效或过期的安全令牌。所以,我已经检查了发送和接收超时,并且它已经设置为10分钟:sendTimeout="00:10:00"receiveTimeout="00:10:00" (请求通常需要5-15秒)

我的招投标配置:

代码语言:javascript
复制
<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" useDefaultWebProxy="true">
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Basic"/>
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

另外,我又查了两遍:

  • ELB和机器防火墙在端口80和443上都是开放的。
  • 我的ELB配置了正确的证书,并在端口443上有一个侦听器。
  • 我在这两台机器上都有一个IIS Web服务器。如果我使用ELB地址,一切都正常。
  • 如果ELB路线到一台机器,WCF工作。如果路由到两台机器,WCF就会失败。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-24 13:53:16

我设法解决了这个问题,添加了以下参数:establishSecurityContext="false"

代码语言:javascript
复制
<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" useDefaultWebProxy="true">
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Basic"/>
        <message clientCredentialType="UserName" 
                 establishSecurityContext="false"/> <!-- this line -->
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

谷歌,我了解到:

当此值设置为false时,必须使用非对称加密对每个调用进行密钥交换和验证。这个参数的默认值是true,这意味着第一个调用将创建一个具有非对称加密的安全上下文,但是它将被缓存,并且进一步的调用将只使用对称加密,这会更快。

性能考虑:亚龙·纳维

当期望客户端连续进行多个调用时,最好将此参数设置为true,但在负载平衡的情况下,调用将被路由到不同的服务器,这会由于令牌无效而中断消息。因此,您必须禁用此安全上下文功能。

建立安全上下文部分的详细说明:https://msdn.microsoft.com/en-us/library/hh273122(v=vs.100).aspx

票数 10
EN

Stack Overflow用户

发布于 2014-08-24 05:11:33

基于您在ELB上安装了正确证书的声明,我假设您正在使用SSL卸载。这可能是一个问题,因为客户端绑定需要使用传输安全进行配置,但是服务将通过端口80接收请求,因此需要进行不同的绑定配置。

但是,WCF在指定客户端凭据时需要传输安全性,因此如果需要发送客户端凭据,则可能必须关闭SSL卸载。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25464506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档