Pregunta

En un proyecto reciente de SharePoint, implementé un elemento web de autenticación que debería reemplazar el cuadro de diálogo de autenticación NTLM.Funciona bien siempre que el usuario proporcione credenciales válidas.Siempre que el usuario proporciona credenciales no válidas, aparece el cuadro de diálogo NTLM en Internet Explorer.

Mi código Javascript que realiza la autenticación a través de XmlHttpRequest tiene este aspecto:

function Login() {
   var request = GetRequest(); // retrieves XmlHttpRequest
   request.onreadystatechange = function() {
      if (this.status == 401) {     // unauthorized request -> invalid credentials
         // do something to suppress NTLM dialog box...
         // already tried location.reload(); and window.location = <url to authentication form>;
      }
   }
   request.open("GET", "http://myServer", false, "domain\\username", "password");
   request.send(null);
}

No quiero que se muestre el cuadro de diálogo NTLM cuando el usuario proporciona credenciales no válidas.En su lugar, se debe ejecutar la devolución mediante el botón de inicio de sesión en el formulario de autenticación.En otras palabras, el navegador no debería enterarse de mi solicitud no autorizada.

¿Hay alguna manera de hacer esto a través de Javascript?

¿Fue útil?

Solución

MarcaEl comentario de es correcto;El mensaje de autenticación NTLM se activa mediante un código de respuesta 401 y la presencia de NTLM como primer mecanismo ofrecido en el encabezado WWW-Authenticate (Ref: El protocolo de autenticación NTLM).

No estoy seguro de haber entendido correctamente la descripción de la pregunta, pero creo que está intentando ajustar la autenticación NTLM para SharePoint, lo que significa que no tiene control sobre el protocolo de autenticación del lado del servidor, ¿correcto?Si no puede manipular el lado del servidor para evitar enviar una respuesta 401 en credenciales fallidas, entonces no podrá evitar este problema, porque es parte de la especificación (del lado del cliente):

El objeto XMLHttpRequest

Si la UA admite la autenticación HTTP [RFC2617], debe considerar que las solicitudes que se originan en este objeto son parte del espacio de protección que incluye los URI al que se accede y envía encabezados de autorización y manejar 401 solicitudes no autorizadas adecuadamente.Si la autenticación falla, los UA deben solicitar las credenciales a los usuarios.

Por lo tanto, la especificación en realidad exige que el navegador avise al usuario en consecuencia si se recibe alguna respuesta 401 en una XMLHttpRequest, como si el usuario hubiera accedido a la URL directamente.Hasta donde puedo decir, la única forma de evitar esto sería tener control sobre el lado del servidor y evitar las respuestas 401 no autorizadas, como mencionó Mark.

Una última idea es que es posible que pueda solucionar este problema utilizando un proxy, como un script del lado del servidor independiente en otro servidor web.Luego, ese script toma un usuario y pasa un parámetro y verifica la autenticación, de modo que el navegador del usuario no es el que realiza la solicitud HTTP original y, por lo tanto, no recibe la respuesta 401 que está causando el mensaje.Si lo hace de esta manera, puede averiguar en su secuencia de comandos "proxy" si falló y, de ser así, volver a preguntar al usuario hasta que tenga éxito.En un evento de autenticación exitoso, simplemente puede recuperar la solicitud HTTP tal como está ahora, ya que todo funciona si las credenciales se especifican correctamente.

Otros consejos

IIRC, el navegador muestra el cuadro de diálogo de autenticación cuando aparece lo siguiente en el flujo de solicitud:

  • Estado http de 401
  • Encabezado de autenticación WWW

Supongo que necesitarías suprimir uno o ambos.La manera fácil de hacerlo es tener un método de inicio de sesión que tome un nombre de usuario y contraseña Base64 (estás usando HTTPS, ¿verdad?) y devolverá 200 con un estado válido/no válido.Una vez validada la contraseña, podrá utilizarla con XHR.

Pude hacer que esto funcionara para todos los navegadores excepto Firefox.Vea la publicación de mi blog a continuación de hace unos años.Mi publicación está dirigida únicamente a IE, pero con algunos pequeños cambios de código debería funcionar en Chrome y Safari.

http://steve.thelineberrys.com/ntlm-login-with-anonymous-fallback-2/

EDITAR:

La esencia de mi publicación es envolver su llamada JS xml en una declaración try catch.En IE, Chrome y Safari, esto suprimirá el cuadro de diálogo NTLM.No parece funcionar como se esperaba en Firefox.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top