Java problema que consume WebService hospedada en IIS asegurada por WindowsAuthentication

APP Descripción

El APP que se comporta incorrectamente es un APP Android que permite al usuario tomar una foto de su teléfono y luego subirla a un CMS de punto compartido.

Descripción detallada del problema

En una aplicación Java, estoy enviando una solicitud POST HTTP que contiene los bytes de una imagen como base64 a un SOAP WebService hospedado en IIS. Este WebService está asegurado utilizando Windows Authentication. He configurado el programa Java para enviar credenciales cuando se haga una solicitud. Cuando comprobé el código de respuesta HTTP es HTTP 401 Unauthorized. No puedo comprobar el contenido de la respuesta.

Observaciones de la nota

El depurador de Java no entra en el getPasswordAuthentication método del Authenticator clase como debería ser.

APP Specs

  • Lenguaje de programación: Java
  • Tipo de aplicación: Android APP
  • Ubicación del código: Dentro de un AsyncTask
  • Tipo de punto final: SOAP WebService
  • autenticación de endpoint: Autenticación de Windows

Código pertinente

Configuración de conexión

URL url = new URL(ENDPOINT_URL);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// Enable POST
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "text/xml");

Configuración Authenticator para enviar siempre credenciales almacenadas

Authenticator.setDefault(new NTLMAuthenticator());

Clase NTLMAuthenticator

public class NTLMAuthenticator extends Authenticator {
    @Override
    public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("USER_NAME", "PASSWORD".toCharArray());
    }
}

Solicitud de configuración de contenido POST

try (OutputStream outputStream = httpURLConnection.getOutputStream()) {
    String baseRequest = "xml version=\"1.0\" encoding=\"utf-8\"?%s%s%strue";
    File f = new File(PATH_TO_FILE);
    byte[] fileBytes = FileUtils.readFileToByteArray(f);
    String fileBase64 = android.util.Base64.encodeToString(fileBytes, 0);
    outputStream.write(String.format(baseRequest, LIST_NAME, fileBase64, FILE_NAME).getBytes());
    outputStream.flush();
} catch (Exception e) {
    e.printStackTrace();
}

Response READ

int response_code = httpURLConnection.getResponseCode();
if (response_code == HttpURLConnection.HTTP_OK) {
    // **response_code IS HTTP_UNAUTHORIZED**
    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()))) {
        // **Unreachable code**
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            // Read response line by line
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Pregunta hecha hace 3 años, 4 meses, 27 días - Por rubyrogue


2 Respuestas:

  • El problema que estás experimentando se debe a que estás intentando autenticarte con el servidor utilizando NTLM a través de NTLMAuthenticator, pero la autenticación requerida es Windows Authentication. Para autenticarte correctamente con un servidor que requiere Windows Authentication, necesitas establecer las credenciales en la conexión HTTP de una manera diferente.

    Aquí te dejo un ejemplo de cómo podrías ajustar tu código para utilizar credenciales de Windows Authentication:

    java
    URL url = new URL(ENDPOINT_URL);
    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    // Enable POST
    httpURLConnection.setDoOutput(true);
    httpURLConnection.setRequestMethod("POST");
    httpURLConnection.setRequestProperty("Content-Type", "text/xml");
    
    // Configurar las credenciales de Windows Authentication
    String userPassword = "USER_NAME:PASSWORD";
    String encoding = Base64.getEncoder().encodeToString(userPassword.getBytes());
    httpURLConnection.setRequestProperty("Authorization", "Basic " + encoding);
    

    En este código, primero debes codificar tus credenciales en Base64 y establecerlas en la conexión HTTP utilizando el encabezado de Authorization con el esquema Basic. Esto enviará las credenciales al servidor en el formato adecuado para la autenticación de Windows.

    Espero que esta solución te ayude a resolver el problema de autenticación con el servidor que utiliza Windows Authentication. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 09:25 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Posibles problemas y soluciones:

    1. Autenticación incorrecta:

    Verifica que el nombre de usuario y la contraseña proporcionados en NTLMAuhenticator sean correctos. Asegurate de que la cuenta de usuario tenga permisos para acceder al WebService.

    2. URL de punto final incorrecta:

    Verifica que la URL del punto final proporcionada en URL url = new URL(ENDPOINT_URL); sea correcta. Asegurate de que el punto final sea accesible desde Internet o desde la red de tu dispositivo Android.

    3. Configuración incorrecta del punto final:

    Asegurate de que el punto final esté configurado para usar Autenticación de Windows y que el protocolo de autenticación sea NTLM. Verifica que el punto final esté configurado para permitir solicitudes POST.

    4. Problemas de conexión:

    Verifica que tu dispositivo Android tenga conexión a Internet. Asegurate de que no haya firewalls o configuraciones de proxy que bloqueen la conexión al punto final.

    5. Problemas de proxy:

    Si utilizas un proxy, verifica que esté configurado correctamente en la configuración de red de tu dispositivo Android. Asegurate de que el punto final sea accesible a través del proxy.

    6. Desactivación del depurador:

    Asegurate de que el depurador de Java no esté desactivado. El depurador debería permitir la entrada en el método getPassordAuthentication de la clase Authenicator.

    Pasos adicionales de solución de problemas:

    Habilita la depuración de red en tu dispositivo Android para ver los detalles de la solicitud y la respuesta HTTP. Utiliza una herramienta de monitoreo de red como Wireshark para analizar el tráfico de red y detectar cualquier problema de autenticación o conexión. Compara tu implementación con ejemplos de trabajo o documentación para la autenticación de NTLM con servicios Web de Java. * Ponte en contacto con el administrador del servidor que aloja el WebService para obtener ayuda con la configuración o los problemas de autenticación.

    Respondida el Dec 19, 2020 a las 09:33 - por Gemini

    Votos positivos: 0 | Votos negativos: 0