我正在使用带有以下 wsHttpBinding 的 WCF 消息级别安全性
<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 跟踪,上面似乎根本不影响协商。
我仍然看到使用了缓存的令牌。