首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证Java中的NTLMv2身份验证

验证Java中的NTLMv2身份验证
EN

Stack Overflow用户
提问于 2012-06-23 03:38:47
回答 2查看 3.9K关注 0票数 2

所以我试图用NTLMv2和Java来追踪一个奇怪的bug。似乎NTLM忽略了我在基于Java的身份验证过程中传递的任何信息,并在其他地方找到了这些信息。因此,即使我提供了不正确的信息,NTLM也将在我的计算机上进行身份验证,并且即使提供了正确的信息,NTLM也不会在任何其他计算机上工作。端点是MOSS2007webservice API (如果相关的话)。

下面是我用来进行身份验证的过程:

1)传入目标站点和登录信息。

代码语言:javascript
复制
try {
    JLists list = new JLists(siteUrl, DEFAULT_SP_USERNAME,
        DEFAULT_SP_PASSWORD);
    list.addList(name, description, 101);

} catch (Exception e) {
     e.printStackTrace();
}

2)将默认身份验证器设置为我自己的NTLMAuthenticator,创建服务存根并传入登录信息。

代码语言:javascript
复制
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类的一个副本:

代码语言:javascript
复制
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信息,并使用它来代替提供的信息,但我不知道在什么情况下会发生这种情况。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 04:10:17

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

如果不对Java源代码进行反编译并亲自修改该变量,似乎就无法绕过这一步,但值得庆幸的是,在我的应用程序的最终用例中不需要这样做。

票数 1
EN

Stack Overflow用户

发布于 2014-03-20 13:54:08

您可以提供自己的

代码语言:javascript
复制
public class Handler extends jdk6.sun.net.www.protocol.http.Handler

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

代码语言:javascript
复制
field.setAccessible( true );
field.setBoolean( connection, false );

字段为tryTransparentNTLMServer和tryTransparentNTLMProxy;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11162996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档