【发布时间】:2012-12-08 06:02:06
【问题描述】:
所以最近我们向 Java 客户端公开了一项服务。我们的服务利用传输安全以及用户名/密码验证。
在尝试调用我们的服务时,客户端收到关于安全标头的异常。进一步的研究表明,WCF 期望时间戳包含在从客户端传递的 SOAP 标头中。如果这不存在(或方差大于 5 分钟),它将引发异常。
我们还发现 Java 客户端没有通过 WCF 预期的时间戳。我们发现的唯一解决方法是实现 CustomBinding 并将 IncludeTimestamp 设置为 false。这允许客户端成功调用服务。
今天在查找 WCF 安全性最佳实践时,我在 MSDN 上看到以下内容:
在自定义绑定上将 SecurityBindingElement.IncludeTimestamp 设置为 True
创建自定义绑定时,必须将 IncludeTimestamp 设置为 真的。否则,如果 IncludeTimestamp 设置为 false,则客户端 正在使用基于非对称密钥的令牌,例如 X509 证书, 邮件不会被签名。
所以,我的问题是,在将 SSL(传输)用于非 .NET 客户端的同时将 WCF(以及最终的 Web API)服务暴露给外界时,最佳做法是什么???
【问题讨论】:
-
不同服务工具包之间有很多差异,我不确定最佳实践是什么。我发现消息中带有用户名或带有基本身份验证的 HTTPS 与大多数工具包兼容。即便如此,就像您发现的那样,WCF 在限制性更强的方面犯了错误,而 Java 工具包则更加宽松。 WCF 不断向自定义绑定添加更多标志来解决这些问题。