【问题标题】:Verifying NTLMv2 authentication in Java在 Java 中验证 NTLMv2 身份验证
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

你可以提供自己的

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

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

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

字段为“tryTransparentNTLMServer”和“tryTransparentNTLMProxy”;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多