我正在使用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跟踪,看来上面根本不会影响协商。
我仍然看到使用了缓存的令牌。
答案 0 :(得分:3)
使用邮件级别安全性时,WCF会发出基于安全上下文令牌的身份验证(SCT)
这种类型的身份验证只依赖于粘性会话,无法绕过它。
有一个设置应该禁用它EstablishSecurityContext = false,但这不起作用。设置完之后,我可以看到SCT的使用方式与以前一样(我在微软有人确认我在这里没有做任何异常)。可能还有另一个依赖于此设置,但一位资深的MS工程师不知道为什么这个设置也不起作用。
这留下了一些选项
一个。使用Kerberos使用“一次性”调用 - 我没有探索这个,因为在我的场景中打开kerberos会更令人头疼
湾使用基于NTLM的auth的自定义绑定 - 我试过这个,但SCT仍在使用,所以它对我不起作用
℃。使用联合安全性与自定义令牌发布服务。这样就可以更好地控制令牌的发布方式,但是不必要(在我的情况下)必须管理这个令牌
<强> d。使用基本的http绑定与TransportCredentialOnly安全模式。这很好,因为它会停止SCT协商,同时仍然传递一个Windows凭证。