所以我试图用NTLMv2和Java来追踪一个奇怪的bug。似乎NTLM忽略了我在基于Java的身份验证过程中传递的任何信息,并在其他地方找到了这些信息。因此,即使我提供了不正确的信息,NTLM也将在我的计算机上进行身份验证,并且即使提供了正确的信息,NTLM也不会在任何其他计算机上工作。端点是MOSS2007webservice 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信息,并使用它来代替提供的信息,但我不知道在什么情况下会发生这种情况。
发布于 2012-06-26 04:10:17
这个问题似乎是基于Java的“单点登录”功能。因为我在Windows机器上尝试NTLM身份验证,所以Java有一个硬编码的值默认为当前帐户的登录信息,然后只有在失败时才使用Java Authenticator。
如果不对Java源代码进行反编译并亲自修改该变量,似乎就无法绕过这一步,但值得庆幸的是,在我的应用程序的最终用例中不需要这样做。
发布于 2014-03-20 13:54:08
您可以提供自己的
public class Handler extends jdk6.sun.net.www.protocol.http.Handler通过一些反射,您可以获取HttpURLConnection类的字段并对其进行修改。
field.setAccessible( true );
field.setBoolean( connection, false );字段为tryTransparentNTLMServer和tryTransparentNTLMProxy;
https://stackoverflow.com/questions/11162996
复制相似问题