【发布时间】:2012-06-18 17:11:31
【问题描述】:
目前无法使用在 IIS 上运行的 Microsoft Project Server 2007 实例进行身份验证,并通过在 Linux、RHEL 5.5 上运行的 Java 1.6(u19) 客户端启用集成 Windows 身份验证。
注意:客户端在我的 Windows 工作站上工作。
我最初尝试实现 JAX-WS 调用,发现由于身份验证错误(特别是 401.2,然后是 500)而无法检索 WSDL。所以我将其简化为一个 Java 类:
- 创建一个
Authenticator并将其设置为默认值,并在 AD 中使用对项目服务器站点具有权限的用户名/密码 - 创建一个
java.net.URL对象 - 创建
java.net.HttpURLConnection并调用getInputStream - 此时会发生故障。
打开HttpURLConnection 调试我可以看到:
- 从服务器返回初始身份验证失败 (401.2),响应中包含“negotiate”和“NTLM”。
- 客户端创建 NTLM 令牌并将其发送回服务器
- 服务器返回 500 状态码
在日志中的 Windows 服务器上,我可以看到日志文件中没有包含仅针对我的请求的用户名,只有一个“-”,我认为它的意思是“匿名”。
我的想法是 Project Server 不喜欢正在传递和阻塞的 NTLM 令牌。根据有关此的许多帖子,假设 Java 1.6 支持 NTLM(v1 和 v2)。
任何帮助将不胜感激...
2012 年 6 月 20 日更新:将问题缩小到网络安全的本地安全策略设置:基于 NTLM SSP(包括 RPC)的服务器的最低会话安全 .导致 Java 客户端失败的设置是要求 NTLMv2 安全。这与 1.6 JDK 支持 NTLM 的说法背道而驰。
一些参考资料:
【问题讨论】:
-
您是否有证据表明 Java 的
Authenticator类支持 NTLMv2?您引用的两页没有讨论版本控制,也没有明确表示它们支持 NTLM2,我有点怀疑。 -
我会添加更多链接,但由于缺乏“代表”点,我受到了限制。大多数人似乎认为支持 NTLMv2,但就您而言,Java 文档中并未具体说明。但是,LAN Manager 身份验证级别设置为“仅发送/拒绝发送 NTLMv2”,当“最小会话”安全属性中未选中“NTLMv2 会话安全”时,Java 客户端的身份验证工作。我相信“NTLMv2 会话安全”需要在令牌中进行额外的包装,这可能会影响身份验证。会话安全属性可以真正被视为 NTLMv3。
-
我实际上不确定“NTLMv2 会话安全”是什么意思...technet.microsoft.com/en-us/library/cc776157(v=ws.10) 建议它表示“需要 NTLMv2”,尽管我不确定这与“发送 NTLMv2 响应”有何不同仅限。拒绝 LM 和 NTLM”。我可能会对此进行一些实验——我有一段时间没有研究过 Java 中的 NTLM,所以了解这里的最新技术(可以这么说)可能会很有趣。对于它的价值,我们最终编写了自己的实现:msdn.microsoft.com/en-us/library/cc236621(v=prot.13).aspx
-
这有一个很好的解释:Technet Security Watch: NTLM Misundertood .. 假设我的解释正确。
-
所以,在这一点上,在禁用 NTLMv2 会话安全属性的情况下,我的一切工作正常。我相当有信心声明 JAX-WS 2.1.x 或 JDK6 附带的所有 2.1 不支持 NTLMv2 会话安全。
标签: java iis-6 httpurlconnection ntlm project-server