16

Java アプリケーションで Windows NTLM 認証を使用して、イントラネット ユーザーを透過的に認証したいと考えています。ブラウザーを使用している場合 (シングル サインオン)、ユーザーは認証に気付かないはずです。

NTLM をサポートするライブラリをいくつか見つけましたが、どれを使用すればよいかわかりません。

どこから始めればよいですか?

4

5 に答える 5

10

上記のリストのうち、ntlmv2-auth と Jespa のみが NTLMv2 をサポートしています。Jespa は実行可能ですが、商用です。ntlmv2-auth 試したことはありませんが、以前に動作していた Liferay のコードに基づいています。

'ntlm-authentication-in-java' は NTLMv1 のみです。これは古く、安全ではなく、人々が新しい Windows バージョンにアップグレードするにつれて、減少する環境で動作します。JCIFS には NTLMv1 HTTP 認証フィルターがありましたが、実装方法が安全でないプロトコルに対する中間者攻撃になるため、後のバージョンで削除されました。(「ntlm-authentication-in-java」についても同じことが言えます。)

「spnego」プロジェクトは NTLM ではなく Kerberos です。IIS のように完全な IWA をレプリケートする場合は、NTLMv2 と Kerberos (「NTLM」認証、「ネゴシエート」認証、NTLMSSP-in-SPNego 認証、および NTLM-masquerading-as-Negotiate 認証) の両方をサポートする必要があります。

于 2013-02-22T16:04:45.463 に答える
4

Luigi Dragone のスクリプトは非常に古く、常に失敗するようです。

ライブラリjcifsを追加すると、HttpURLConnection は NTLM で動作します。この例では、最新のjcifs-1.3.18で動作します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.impl.auth.NTLMEngineException;

public class TestNTLMConnection {
    public static void main(String[] args) throws UnknownHostException, IOException, NTLMEngineException {
        // Method 1 : authentication in URL
        jcifs.Config.registerSmbURLHandler();
        URL urlRequest = new URL("http://domain%5Cuser:pass@127.0.0.1/");

        // or Method 2 : authentication via System.setProperty()
        // System.setProperty("http.auth.ntlm.domain", "domain");
        // System.setProperty("jcifs.smb.client.domain", "domain");
        // System.setProperty("jcifs.smb.client.username", "user");
        // System.setProperty("jcifs.smb.client.password", "pass");
        // Not verified // System.setProperty("jcifs.netbios.hostname", "host");
        // System.setProperty("java.protocol.handler.pkgs", "jcifs");
        // URL urlRequest = new URL("http://127.0.0.1:8180/simulate_get.php");

        HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();

        StringBuilder response = new StringBuilder();

        try {
            InputStream stream = conn.getInputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(stream));

            String str = "";
            while ((str = in.readLine()) != null) {
                response.append(str);
            }
            in.close();   

            System.out.println(response);
        } catch(IOException err) {
            System.out.println(err);
        } finally {
            Map<String, String> msgResponse = new HashMap<String, String>();

            for (int i = 0;; i++) {
                String headerName = conn.getHeaderFieldKey(i);
                String headerValue = conn.getHeaderField(i);
                if (headerName == null && headerValue == null) {
                    break;
                }
                msgResponse.put(headerName == null ? "Method" : headerName, headerValue);
            }

            System.out.println(msgResponse);
        }
    }
}

また、各ハンドシェイクの内容に興味がある場合は、このスレッドで jcifs と Socket を使用した別の例を見つけることができます。

于 2015-12-16T20:14:06.637 に答える
1

参照: https://jcifs.samba.org/src/docs/faq.html#ntlmv2

Q: jCIFS は NTLMv2 をサポートしていますか?
A:はい。1.3.0 の時点で、JCIFS は NTLMv2 を完全にサポートし、デフォルトで使用します。

注: JCIFS に含まれていた NTLM HTTP SSO フィルターは、NTLMv2 をサポートできません。

于 2017-02-22T19:06:37.660 に答える
0

あなたが与えたリストから比較的、私は JCIFSに行きます。ライブラリは成熟しており、ドキュメントも充実しています。それに加えて、かなり定期的なリリースがあり、最後のリリースは 2011 年 11 月でした。

Personal Experience: 私が試した他のもの (spnego および ntmv2auth) と比較すると、開始するのはかなり簡単でした。

于 2013-02-22T09:41:00.743 に答える