online example asp.net javascript sharepoint

asp.net - example - sharepoint javascript rest api



Suprimir el cuadro de diálogo NTLM después de una solicitud no autorizada (3)

En un proyecto sharepoint reciente, implementé un webpart 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. Cuando el usuario proporciona credenciales no válidas, el cuadro de diálogo NTLM aparece en Internet Explorer.

Mi código Javascript que hace la autenticación a través de XmlHttpRequest se ve así:

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 deseo 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 de datos mediante el botón de inicio de sesión en el formulario de autenticación. En otras palabras, el navegador no debe averiguar sobre mi solicitud no autorizada.

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


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

No estoy seguro si entiendo la descripción de la pregunta correctamente, pero creo que está tratando de 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 sobre credenciales fallidas, entonces no podrá evitar este problema, ya que es parte de la especificación (del lado del cliente):

El objeto XMLHttpRequest

Si el UA admite la Autenticación HTTP [RFC2617], DEBERÍA considerar que las solicitudes que se originan en este objeto forman parte del espacio de protección que incluye los URI accedidos y los encabezados de Autorización de envío, y maneja las solicitudes 401 no autorizadas de manera apropiada. si la autenticación falla, los UA deben solicitar credenciales a los usuarios.

Por lo tanto, la especificación realmente exige que el navegador solicite al usuario la correspondiente respuesta 401 en un XMLHttpRequest, como si el usuario hubiera accedido directamente a la URL. Por lo que puedo decir, la única manera de evitar esto sería que usted tenga el control del lado del servidor y evite que se eviten 401 respuestas no autorizadas, como menciona Mark.

Una última idea es que puede evitar esto utilizando un proxy, como una secuencia de comandos del lado del servidor por separado en otro servidor web. Esa secuencia de comandos toma un usuario y pasa el 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 la solicitud. Si lo haces de esta manera, puedes averiguarlo desde tu script "proxy" si falla, y si es así, avisa al usuario nuevamente 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 están especificadas correctamente.


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

  • Http estado de 401
  • WWW-Authenticate header

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


Pude hacer que funcionara para todos los navegadores excepto Firefox. Vea la publicación de mi blog a continuación de hace algunos años. Mi publicación está dirigida solo 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. Parece que no funciona como se esperaba en Firefox.