Javascript 如何触发浏览器';来自AJAX调用的基本身份验证对话框?

Javascript 如何触发浏览器';来自AJAX调用的基本身份验证对话框?,javascript,ajax,wcf,basic-authentication,wcf-security,Javascript,Ajax,Wcf,Basic Authentication,Wcf Security,我正在使用基本身份验证来保护一组仅在公司网络中公开的WCF web服务,我想知道是否有方法在web服务返回时触发AJAX调用中显示浏览器的凭据对话框 目前,我的AJAX调用将401作为常规失败请求接收,不会提示浏览器执行任何操作。但是,如果我获取相同的URI并将其复制粘贴到浏览器的URL栏中,则返回的401将正确触发基本身份验证对话框 有没有办法让AJAX回调通知浏览器弹出该对话框?如果没有,则需要为请求提供凭据 请参见是的,您可以从AJAX调用它。只需使用以下标题传递请求: withCrede

我正在使用基本身份验证来保护一组仅在公司网络中公开的WCF web服务,我想知道是否有方法在web服务返回时触发AJAX调用中显示浏览器的凭据对话框

目前,我的AJAX调用将401作为常规失败请求接收,不会提示浏览器执行任何操作。但是,如果我获取相同的URI并将其复制粘贴到浏览器的URL栏中,则返回的401将正确触发基本身份验证对话框


有没有办法让AJAX回调通知浏览器弹出该对话框?

如果没有,则需要为请求提供凭据


请参见

是的,您可以从AJAX调用它。只需使用以下标题传递请求:


withCredentials:true

使用url动态创建一个iframe并附加到文档中。它将触发身份验证表单。jQuery snipet添加iframe

$('<iframe src="your_url"></iframe>').appendTo('body')
$(“”).appendTo('body')
下面是一个非常简单的示例:

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
    }
});
var url='your_url_here';
$.ajax({
url:url,
错误:函数(响应){
如果(response.status==401){
$('')。附于('正文');
}
},
成功:函数(){
//你的成功代码在这里
}
});

您建议打开/显示/插入一个表单,允许插入用户名和密码,然后使用给定的凭据重新发送AJAX请求。我不会真的在浏览器上


如何设置身份验证标头您可以在此处阅读:

在堆栈中的某个位置:

收到401响应时,服务器会告诉您,“您不是 已验证–完全未验证或已验证 错误–请重新验证并重试。“为了帮助您, 它将始终包含一个描述如何进行身份验证的WWW身份验证标头 鉴定

使用jQuery的
beforeSend
回调添加带有身份验证信息的HTTP头

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

您是否满足中突出显示的条件


此外,您可能需要检查从后端返回的头是否相同,无论您是从浏览器还是从AJAX调用请求它。

您可以在检查401条件时触发重定向:

window.location = "https://example.com"

我也面临着几乎相同的401问题,除了我的请求是跨域的。但我希望原因是一样的。按照上的说明,我终于成功地使用simple:

var xhttp=new XMLHttpRequest();
xhttp.withCredentials = true;
xhttp.open("GET", "https://my.foo.server/app/resource", true);
xhttp.send();
我认为
xhttp.withCredentials
是解决方案。这不是头球!您允许浏览器通过cookie与服务器通信。下面的答案解释了很多


没有
xhttp。有凭据时总是
401(未经授权)
。但是使用它,浏览器添加了所需的头
授权:Basic dGVfoosawvuda==
在凭据不可用时触发登录对话框。

如果需要,它应该自动弹出,即使是从不可见的ajax代码中。您可能需要一个更具体的ajax错误处理程序。它不是答案,只是建议使用注释。是否有更好的方法来管理上下文?也许是为了获得在iframe中传递的数据并将其推回到success函数?我宁愿保持iframe不可见。也许还支持POST方法?@jab如果使iframe不可见,浏览器可能不会发出任何请求,因此没有身份验证对话框。最好将其设置为1x1 px或使用绝对位置,并使用非常大的顶部和左侧使其与文档视图端口分离。从iframe将数据推送到success函数的一种方法是,使success函数全局可访问,并从类似iframe的window.top.调用它。success(data)头是相同的,我总是传回
WWW authenticate
,无论未成功验证时请求的类型如何。在这种情况下,我可以完全控制服务器,因此如果需要,我可以返回额外的头。我知道,然后我不确定问题是什么,我以前见过使用PockDB/couchDB,我可以总结一个小例子你可以在plunkr上创建一个小例子吗?我可以看一看吗?我遇到了同样的问题,这个答案直接引导我使用类似的
凭据
配置。