【发布时间】:2012-06-22 19:38:46
【问题描述】:
所以我正试图找出一个关于 NTLMv2 和 Java 的奇怪错误。似乎 NTLM 忽略了我在基于 Java 的身份验证期间传入的任何信息,并在其他地方找到了这些信息。因此,即使我提供了不正确的信息,NTLM 也会在我的机器上进行身份验证,并且即使提供了正确的信息,它也不会在任何其他机器上工作。如果相关,端点是 MOSS 2007 网络服务 API。
这是我用来验证的过程:
1) 传入目标站点和登录信息。
try {
JLists list = new JLists(siteUrl, DEFAULT_SP_USERNAME,
DEFAULT_SP_PASSWORD);
list.addList(name, description, 101);
} catch (Exception e) {
e.printStackTrace();
}
2)将默认验证器设置为我自己的NTLMAuthenticator,
创建服务存根并传入登录信息。
public JLists(String siteURI, String username, String password)
throws Exception {
String endpointURI = siteURI + "/_vti_bin/Lists.asmx";
Authenticator.setDefault(new NtlmAuthenticator(username, password));
port = sharePointListsAuth(username, password);
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
endpointURI);
}
private ListsSoap sharePointListsAuth(String userName, String password) throws Exception {
ListsSoap port = null;
if (userName != null && password != null) {
try {
service = new Lists();
port = service.getListsSoap();
((BindingProvider) port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, userName);
((BindingProvider) port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
} catch (Exception e) {
throw new Exception("Error: " + e.toString());
}
} else {
throw new Exception("Couldn't authenticate: Invalid connection details given.");
}
return port;
}
这是 NTLMAuthenticator 类的副本:
import java.net.Authenticator;
import java.net.PasswordAuthentication;
class NtlmAuthenticator extends Authenticator {
private final String username;
private final char[] password;
public NtlmAuthenticator(final String username, final String password) {
super();
this.username = username;
this.password = password.toCharArray();
}
public PasswordAuthentication getPasswordAuthentication() {
return (new PasswordAuthentication (username, password));
}
}
3) 拨打我的服务电话。在这部分我真的没有任何问题,但是如果有人需要代码,我也会发布它。
我觉得 Java 以某种方式引用了我的 Active Directory 信息,并使用它来代替提供的信息,但我不知道什么时候会发生这种情况。
【问题讨论】:
-
我使用 Wireshark 确认连接确实是使用 NTLM 创建的,并且在标准的 3 步 NTLM 过程中进行身份验证没有任何问题,即使给定的用户名/密码不正确。
标签: java authentication netbeans ntlm ntlmv2