阻止WCF缓存/重新使用安全令牌(SecurityContextToken)

时间:2013-03-22 20:11:15

标签: wcf wcf-security ws-security

我正在使用WCF消息级安全性以及以下wsHttpBinding

  <security mode="Message">
    <message clientCredentialType="Windows" establishSecurityContext="false" />
  </security>
  • 每次我调用该服务都是一个单独的操作,并且不需要保持任何会话状态。

  • 我遇到了负载均衡器的问题,因为WCF不断重复使用安全令牌,所以如果第一次调用转到NodeA,它会创建一个重用的安全令牌。如果该令牌传递给NodeB绊倒 MessageSecurityException

  • 似乎微软的回答是使用粘性会话,这是我们探索的内容,但在我们的设置中没有意义

有没有办法简单地强制WCF在每次调用时创建一个新的安全令牌? (使用带有Windows凭据类型的消息级别安全性?

更新

我在客户端/服务器上设置跟踪,我可以看到令牌缓存了24小时。

<ServiceToken>
<SessionTokenType>System.ServiceModel.Security.Tokens.BufferedGenericXmlSecurityToken</SessionTokenType>
<ValidFrom>2013-03-23T21:21:32.569Z</ValidFrom>
<ValidTo>2013-03-24T07:21:32.569Z</ValidTo>
<InternalTokenReference>LocalIdKeyIdentifierClause(LocalId = 'uuid-291b4a38-af17-4832-bc7a-6fb65dcc3c3c-18', Owner = 'System.ServiceModel.Security.Tokens.SecurityContextSecurityToken')</InternalTokenReference>
  

IssuanceTokenProvider使用了缓存的服务令牌。

我尝试使用以下方法禁用令牌兑现:

IssuedTokenClientCredential itcc = service.ClientCredentials.IssuedToken;
itcc.CacheIssuedTokens = false;
itcc.LocalIssuerAddress = new EndpointAddress("http://localhost:####/myservice");
itcc.LocalIssuerBinding = new WSHttpBinding("my_wsHttp_bindingConfig");
itcc.MaxIssuedTokenCachingTime = new TimeSpan(0,0,0);

但是看一下wcf跟踪,看来上面根本不会影响协商。

我仍然看到使用了缓存的令牌。

1 个答案:

答案 0 :(得分:3)

经过大量的研究,并通过WCF跟踪,并联系微软,我得到了这个问题的底部。

  1. 使用邮件级别安全性时,WCF会发出基于安全上下文令牌的身份验证(SCT)

  2. 这种类型的身份验证只依赖于粘性会话,无法绕过它。

  3. 有一个设置应该禁用它EstablishSecurityContext = false,但这不起作用。设置完之后,我可以看到SCT的使用方式与以前一样(我在微软有人确认我在这里没有做任何异常)。可能还有另一个依赖于此设置,但一位资深的MS工程师不知道为什么这个设置也不起作用。

  4. 这留下了一些选项

    一个。使用Kerberos使用“一次性”调用 - 我没有探索这个,因为在我的场景中打开kerberos会更令人头疼

    湾使用基于NTLM的auth的自定义绑定 - 我试过这个,但SCT仍在使用,所以它对我不起作用

    ℃。使用联合安全性与自定义令牌发布服务。这样就可以更好地控制令牌的发布方式,但是不必要(在我的情况下)必须管理这个令牌

    <强> d。使用基本的http绑定与TransportCredentialOnly安全模式。这很好,因为它会停止SCT协商,同时仍然传递一个Windows凭证。

  5. 4.d对我来说最简单,因为除了配置之外我不需要做很多改动。我放弃了wshttpbinding功能,但到目前为止这是可以的,因为这个对话发生在一个受信任的网络中。