¿Cómo disparo el dialog de Autenticación básica del browser desde una llamada AJAX?

Estoy usando authentication básica para asegurar un set de web services WCF expuestos solo dentro de nuestra networking corporativa, y me preguntaba si había una manera de activar el dialog de cnetworkingenciales del browser para que aparezca desde una llamada AJAX cuando el service web retorna con un 401 ¿error?

Actualmente, mi llamada AJAX recibe el 401 como una request fallida regular y no solicita al browser que haga nada. Sin embargo, si tomo el mismo URI y lo copio y pego en la barra de URL del browser, el 401 devuelto activa correctamente el cuadro de dialog Autenticación básica.

¿Hay alguna forma de get la callback AJAX para decirle al browser que aparezca ese cuadro de dialog?

8 Solutions collect form web for “¿Cómo disparo el dialog de Autenticación básica del browser desde una llamada AJAX?”

Cree dinámicamente un iframe con su url y anexe al documento. Activará el formulario de authentication. jQuery snipet para agregar iframe

$('<iframe src="your_url"></iframe>').appendTo('body') 

Un ejemplo muy simplificado es aquí:

 var url = 'your_url_here'; $.ajax({ url: url, error: function(response){ if(response.status==401){ $('<iframe src="'+url+'"></iframe>').appendTo('body'); } }, success:function(){ //your success code here } }); 

No puede, deberá proporcionar la request con las cnetworkingenciales.

Consulte Cómo usar Basic Auth con jQuery y AJAX?

Sugeriría abrir / mostrar / insert un formulario para permitir la inserción de nombre de usuario y contraseña, y luego reenviar la request AJAX con las cnetworkingenciales especificadas. Realmente no lo haría en la window emergente de las cnetworkingenciales de los browseres.

Cómo configura el encabezado de authentication que puede leer aquí: Cómo usar Basic Auth con jQuery y AJAX?

Sí, puedes invocarlo desde AJAX. Simplemente pase la request con el siguiente encabezado:

withCnetworkingentials: true

He enfrentado casi el mismo problema 401, a exception de que mi request fue de dominio cruzado. Pero espero que la razón sea la misma. Siguiendo las instrucciones en developer.mozilla – Control de acceso CORS finalmente he tenido éxito con simple:

 var xhttp=new XMLHttpRequest(); xhttp.withCnetworkingentials = true; xhttp.open("GET", "https://my.foo.server/app/resource", true); xhttp.send(); 

Creo que xhttp.withCnetworkingentials es la solución. No es encabezado! Permite que el browser se comunique con el server a través de cookies. La siguiente respuesta explica mucho XHR2 withCnetworkingentials: ¿qué cookies se envían?

Sin xhttp.withCnetworkingentials siempre había 401 (Unauthorized) . Pero al usarlo, el browser agregó la Authorization:Basic dGVFooFooFooFoosaWVudA== encabezado requerida Authorization:Basic dGVFooFooFooFoosaWVudA== o activó el cuadro de dialog de inicio de session , cuando las cnetworkingenciales aún no estaban disponibles.

Como se encuentra en algún lugar de la stack:

Recibir una respuesta 401 es que el server le diga "no está autenticado, ni autenticado ni autenticado de manera incorrecta, pero vuelva a autentificarse y vuelva a intentarlo". Para ayudarlo, siempre includeá un encabezado WWW-Authenticate que describa cómo autenticarse

Use la callback beforeSend de jQuery para agregar un encabezado HTTP con la información de authentication

 beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", "Basic " + btoa(username + ":" + password)); }, 

¿Cumple con las condiciones resaltadas en esta respuesta SO?

También basado en esta otra respuesta , puede verificar que los encabezados devueltos desde su server sean los mismos ya sea que los solicite desde el browser o desde una llamada AJAX.

solo podría desencadenar una networkingirección cuando compruebe la condición 401:

 window.location = "https://example.com" 
Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.