2

だから私はNTLMv2とJavaの奇妙なバグを突き止めようとしています。NTLMは、Javaベースの認証中に渡した情報を無視し、別の場所で情報を見つけているようです。このため、NTLMは、間違った情報を提供した場合でも自分のマシンで認証され、正しい情報が提供された場合でも他のマシンでは機能しません。エンドポイントは、関連する場合はMOSS2007Webサービス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がどういうわけか私のActiveDirectory情報を参照し、代わりに提供された情報を使用しているように感じますが、それがどの時点で発生するかわかりません。

4

2 に答える 2

1

問題はJavaの「シングルサインオン」機能に基づいているようです。WindowsマシンでNTLM認証を試みているため、Javaにはハードコードされた値があり、デフォルトで現在のアカウントのログイン情報になり、失敗した場合にのみJavaAuthenticatorを使用します。

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 に答える