2

所以我试图用 NTLMv2 和 Java 找出一个奇怪的错误。似乎 NTLM 忽略了我在基于 Java 的身份验证期间传入的任何信息,并在其他地方找到了这些信息。因此,即使我提供了不正确的信息,NTLM 也会在我的机器上进行身份验证,并且即使提供了正确的信息,它也不会在任何其他机器上工作。如果相关,端点是 MOSS 2007 Web 服务 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 信息,并使用它来代替提供的信息,但我不知道在什么时候会发生这种情况。

4

2 回答 2

1

问题似乎是基于 Java 的“单点登录”功能。因为我在 Windows 机器上尝试 NTLM 身份验证,Java 有一个硬编码值,默认为当前帐户的登录信息,然后仅在失败时使用 Java Authenticator。

如果不反编译Java源并自己修改该变量,似乎没有办法绕过这个问题,但幸运的是,在我的应用程序的最终情况下不需要这样做。

于 2012-06-25T20:10:16.817 回答
0

你可以提供你自己的

public class Handler extends jdk6.sun.net.www.protocol.http.Handler

通过一些反射,您可以获得 HttpURLConnection 类的字段,并对其进行修改。

field.setAccessible( true );
field.setBoolean( connection, false );

字段是“tryTransparentNTLMServer”和“tryTransparentNTLMProxy”;

于 2014-03-20T05:54:08.003 回答