Javascript 如何触发浏览器';来自AJAX调用的基本身份验证对话框?
我正在使用基本身份验证来保护一组仅在公司网络中公开的WCF web服务,我想知道是否有方法在web服务返回时触发AJAX调用中显示浏览器的凭据对话框 目前,我的AJAX调用将401作为常规失败请求接收,不会提示浏览器执行任何操作。但是,如果我获取相同的URI并将其复制粘贴到浏览器的URL栏中,则返回的401将正确触发基本身份验证对话框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
有没有办法让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上创建一个小例子吗?我可以看一看吗?我遇到了同样的问题,这个答案直接引导我使用类似的凭据配置。