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 %s true ";
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 claseAuthenicator
.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