ti-enxame.com

Usando a autenticação NTLM em aplicativos Java

Eu quero usar a autenticação do Windows NTLM no meu aplicativo Java para autenticar os usuários da intranet de forma transparente. Os usuários não devem notar nenhuma autenticação se estiverem usando seus navegadores (logon único).

Eu encontrei algumas bibliotecas com suporte a NTLM, mas não sei qual usar:

Alguma sugestão por onde começar?

11
deamon

Fora da lista acima, apenas ntlmv2-auth e Jespa suportam NTLMv2. Jespa é viável, mas comercial. ntlmv2-auth Eu não tentei, mas é baseado no código do Liferay, que eu já vi trabalhando antes.

'ntlm-authentication-in-Java' é apenas NTLMv1, que é antigo, inseguro e funciona em um número cada vez menor de ambientes, à medida que as pessoas atualizam para versões mais recentes do Windows. O JCIFS costumava ter um filtro de autenticação HTTP NTLMv1, mas foi removido em versões posteriores, já que a forma como foi implementado equivale a um ataque man-in-the-middle no protocolo inseguro. (O mesmo parece ser verdade para 'ntlm-authentication-in-Java'.)

O projeto 'spnego' é o Kerberos e não o NTLM. Se você quiser replicar o IWA completo como IIS ele precisa replicar o NTLMv2 e o Kerberos (autenticação 'NTLM', 'Negotiate' auth, autenticação NTLMSSP-in-SPNego e máscara de NTLM-masquerading- como-Negociar Autenticação).

10
bobince

O roteiro de Luigi Dragone é muito antigo e parece sempre falhar.

HttpURLConnection pode trabalhar com NTLM se você adicionar biblioteca jcifs , este exemplo funciona com o mais recente 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);
        }
    }
}

E se você está curioso sobre o conteúdo de cada handshake, você pode encontrar outro exemplo usando jcifs e Socket neste thread .

3
ron190

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

Q: O jCIFS suporta NTLMv2?
A: Sim. A partir do 1.3.0, o JCIFS suporta totalmente o NTLMv2 e o usa por padrão.

Nota: O Filtro SSO HTTP do NTLM que costumava ser incluído no JCIFS não pode suportar NTLMv2.

0
Nikhil

Relativamente à lista que você deu, eu usaria JCIFS . A biblioteca está madura, e a documentação deles é boa. Ainda por cima, eles tinham bastante regularidade. lançamentos, sendo o último em novembro de 2011.

Personal Experience: foi bastante fácil começar quando comparado com outros que eu tentei (spnego e ntmv2auth)

0
Sudhakar