2012-12-20 117 views
11

所以最近我们向Java客户端公开了一个服务。我们的服务利用运输安全以及用户名/密码验证。WCF Java客户端和IncludeTimestamp

当试图调用我们的服务时,客户端正在接收有关安全头的异常。进一步的研究表明,WCF希望将时间戳包含在从客户端传递的SOAP头中。如果这不存在(或差异大于5分钟),它将引发异常。

我们还发现Java客户端不会传递WCF预期的时间戳。我们发现唯一的解决方法是实现CustomBinding并将IncludeTimestamp设置为false。这允许客户成功地调用服务。

今天在查找安全最佳实践WCF我看MSDN上的以下内容:

设置SecurityBindingElement.IncludeTimestamp为True自定义绑定

当您创建一个自定义绑定,您必须将IncludeTimestamp设置为 true。否则,如果IncludeTimestamp设置为false,并且客户端 正在使用基于非对称密钥的令牌,如X509证书 ,则该消息不会被签名。

所以,我的问题是什么是在向外部世界公开WCF(并最终Web API)服务的同时将SSL(传输)用于非.NET客户端时的最佳实践?

+0

不同的服务工具包之间有很多变化,我不确定最佳实践是什么。我发现使用用户名消息或基本身份验证的HTTPS与大多数工具包兼容。即便如此,就像你发现的那样,WCF在更严格的方面犯了错误,而Java工具包更加松懈。 WCF不断添加更多标志到自定义绑定来解决这些问题。 – Sergey

回答

1

最佳实践只有在可以执行时才有效。如果您无法控制客户端,并且无法发送时间戳,那么通过所有方法将includetimetimeamp设置为false。