con - Autenticación NTLM Javascript/Ajax
jquery ajax json (4)
El problema es que no puede obtener el dominio / usuario actualmente conectado a través de javascript (o si no puede, nunca he encontrado una solución).
Si ya conoce el dominio, el nombre de usuario y la contraseña, puede usar algo como https://github.com/erlandranvinge/ntlm.js/tree/master
Sin embargo, creo que ir por este método para el inicio de sesión único será frustrante a largo plazo.
Terminamos haciendo la autenticación NTLM en un iframe oculto y accediendo al iframe a través de javascript.
Estoy desarrollando una aplicación móvil HTML5, que se comunica con los servicios WebServices
. Los servicios web utilizan el protocolo de autenticación NTLM. Estoy teniendo dificultades para manejar el apretón de manos a través de JavaScript. NTLM envía el 401 unauthorized
como respuesta a mi POST, que no he encontrado ninguna forma de responder.
¿Es posible la autenticación NTLM con JavaScript? ¿Debo crear un servicio web proxy con, por ejemplo, autenticación básica en el medio?
mi llamada jQuery es algo como ...
$.ajax({
type: "POST",
url: URL,
contentType: "text/xml",
dataType: "xml",
data: soapRequest,
username: ''username'',
password: ''password'',
xhrFields: {
withCredentials: true
},
success: processSuccess,
error: processError
});
No tiene que responder al desafío NTLM (Autenticación de Windows Integrada), su navegador debería hacerlo por usted, si está configurado correctamente. Una serie de complicaciones adicionales son también probables.
Paso 1 - Navegador
Verifique que el navegador pueda acceder y enviar sus credenciales con una aplicación web NTLM o al ingresar directamente al software que está desarrollando.
Paso 2 - JavaScript con atributo de credenciales
El 401 error no autorizado recibido y los síntomas descritos son exactamente los mismos cuando no pude establecer el atributo ''withCredentials'' en ''true''. No estoy familiarizado con jQuery, pero asegúrese de que su intento de establecer ese atributo tenga éxito.
Este ejemplo funciona para mí:
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "https://localhost:44377/SomeService", true);
xhttp.withCredentials = true;
xhttp.send();
xhttp.onreadystatechange = function(){
if (xhttp.readyState === XMLHttpRequest.DONE) {
if (xhttp.status === 200)
doSomething(xhttp.responseText);
else
console.log(''There was a problem with the request.'');
}
};
Paso 3 - Servidor lado habilitar CORS (opcional)
Sospecho que una de las principales razones por las que las personas terminan con esta pregunta es que están desarrollando un componente en su estación de trabajo con otro componente alojado en otro lugar. Esto causa problemas de Intercambio de recursos entre orígenes (CORS) . Hay dos soluciones:
- Deshabilite CORS en su navegador: es bueno para el desarrollo cuando finalmente su trabajo se implementará en el mismo origen que el recurso al que está accediendo su código.
- Habilite CORS en su servidor: existe una amplia lectura en Internet, pero esto básicamente implica el envío de encabezados que habilitan CORS.
En resumen, para habilitar CORS con credenciales debe:
- Envíe un encabezado ''Access-Control-Allow-Origin'' que coincida con el origen de la página servida ... esto no puede ser ''*''
- Envíe un ''Access-Control-Allow-Credentials'' con el valor ''true''
Aquí está mi ejemplo de código de trabajo .NET en mi archivo global.asax. Creo que es bastante fácil ver lo que está pasando y traducirlo a otros idiomas si es necesario.
void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.HttpMethod == "OPTIONS")
{
Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
Response.AddHeader("Access-Control-Max-Age", "1728000");
Response.End();
}
else
{
Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (Request.Headers["Origin"] != null)
Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]);
else
Response.AddHeader("Access-Control-Allow-Origin" , "*"); // Last ditch attempt!
}
}
Por lo que he visto, nadie ha implementado la autenticación Windows Integrated / NTLM con AJAX, aunque debería ser posible (estoy considerando hacerlo para un proyecto actual para combinar la autenticación de formularios con el WindowsTokenRoleProvider)
El flujo de trabajo básico debe desglosarse así (basado en artículos here y here ):
- realizar una solicitud GET con un mensaje NTLM tipo 1 codificado en base64 en el encabezado "Autorización"
- elimine el mensaje NTLM tipo 2 codificado en base64 del encabezado "Autenticación WWW" en la respuesta 401.
- realice la operación NTLM en el mediodía recibido en el paso anterior (lo siento, aún no tengo un ejemplo de código)
- realice un GET final con un mensaje NTLM tipo 3 codificado en base64 en el encabezado "Autorización". Esto debería devolver un 200.
La autenticación NTLM a través de HTTP es más una implementación CHAP que usa HTTP que una solicitud HTTP autorizada.
Te actualizaré si realmente logro implementar esto. Lo siento, no podría ser de más ayuda.
Sí, NTLM no es muy divertido. Pero es posible que desee probar esto, https://github.com/tcr/node-ntlm/blob/master/README.md