it-swarm.com.de

Verwenden der NTLM-Authentifizierung in Java-Anwendungen

Ich möchte die Windows NTLM-Authentifizierung in meiner Java-Anwendung verwenden, um Intranet-Benutzer transparent zu authentifizieren. Die Benutzer sollten keine Authentifizierung feststellen, wenn sie ihren Browser verwenden (Single Sign-On).

Ich habe ein paar Bibliotheken mit NTLM-Unterstützung gefunden, weiß aber nicht, welche sie verwenden sollen:

Anregungen, wo Sie anfangen sollen?

11
deamon

Von der obigen Liste unterstützen nur ntlmv2-auth und Jespa NTLMv2. Jespa ist praktikabel aber kommerziell. ntlmv2-auth Ich habe es nicht ausprobiert, aber es basiert auf dem Code von Liferay, den ich zuvor gesehen habe.

'ntlm-authentication-in-Java' ist nur NTLMv1. Dies ist alt, unsicher und funktioniert in immer weniger Umgebungen, wenn Benutzer auf neuere Windows-Versionen aktualisieren. JCIFS verfügte früher über einen NTLMv1-HTTP-Authentifizierungsfilter, der jedoch in späteren Versionen entfernt wurde, da die Implementierung auf einen man-in-the-middle-Angriff des unsicheren Protokolls zurückzuführen ist. (Dasselbe gilt für 'ntlm-authentication-in-Java'.)

Das "Spnego" -Projekt ist Kerberos und nicht NTLM. Wenn Sie vollständige IWA als IIS replizieren möchten, müssen Sie sowohl NTLMv2 als auch Kerberos unterstützen ('NTLM' auth, 'Negotiate' auth, NTLMSSP-in-SPNego-auth und NTLM-Masquerading as-Negotiate auth).

10
bobince

Das Skript von Luigi Dragone ist wirklich alt und scheint immer zu versagen.

HttpURLConnection kann mit NTLM arbeiten, wenn Sie die Bibliothek jcifs hinzufügen. Dieses Beispiel funktioniert mit latest 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:[email protected]/");

        // 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);
        }
    }
}

Und wenn Sie sich für den Inhalt jedes Handshakes interessieren, finden Sie ein weiteres Beispiel mit jcifs und Socket auf diesem thread .

3
ron190

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

F: Unterstützt jCIFS NTLMv2?
A: Ja. Seit 1.3.0 unterstützt JCIFS NTLMv2 vollständig und verwendet es standardmäßig.

Hinweis: Der NTLM-HTTP-SSO-Filter, der früher in JCIFS enthalten war, kann NTLMv2 nicht unterstützen.

0
Nikhil

Relativ von der Liste, die Sie gegeben haben, würde ich mit JCIFS . Gehen. Die Bibliothek ist ausgereift, und ihre Dokumentation ist gut. Um das Ganze abzurunden, gab es recht regelmäßige Veröffentlichungen. und der letzte November 2011.

Personal Experience: es war ziemlich einfach zu starten, wenn ich es mit anderen vergleiche (spnego und ntmv2auth)

0
Sudhakar