【问题标题】:Java 6 HTTPURLConnection and Project Server NTLM Authentication from RHEL5.5来自 RHEL5.5 的 Java 6 HTTPURLConnection 和 Project Server NTLM 身份验证
【发布时间】: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 类:

  1. 创建一个 Authenticator 并将其设置为默认值,并在 AD 中使用对项目服务器站点具有权限的用户名/密码
  2. 创建一个java.net.URL 对象
  3. 创建java.net.HttpURLConnection 并调用getInputStream
  4. 此时会发生故障。

打开HttpURLConnection 调试我可以看到:

  1. 从服务器返回初始身份验证失败 (401.2),响应中包含“negotiate”和“NTLM”。
  2. 客户端创建 NTLM 令牌并将其发送回服务器
  3. 服务器返回 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


【解决方案1】:

不久前,当我遇到这个问题时,我最终使用了其他人创建的方案。

http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html

当我不得不从带有 ntlm 的 iis 服务器获取图像文件时为我工作。 使用上面的代码片段..

AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, org.xyz.JCIFS_NTLMScheme.class);
            HttpClient client = new HttpClient();
            client.getState().setCredentials(AuthScope.ANY, new NTCredentials(userName, password, "", strDomain));
            GetMethod get = new GetMethod(strImageFile);
            get.setDoAuthentication(true);
            client.executeMethod(get);

【讨论】:

  • 感谢您的回复。这看起来很有潜力,但是,它确实需要 Java 6 之外的附加库;这就是我试图在其中工作的内容。该博客还引用了放松会话安全属性以确保解决方案有效,这不适用于我的场景。如果我有时间测试,我会回复。我会投票赞成,但我没有足够的代表点:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多