我使用基本身份验证来保护仅在公司网络中公开的一组WCF Web服务,我想知道是否有办法触发浏览器的凭据对话框从AJAX中显示当Web服务返回401错误时调用?
目前,我的AJAX调用将401作为常规失败请求接收,并且不会提示浏览器执行任何操作。但是,如果我使用相同的URI并将其复制粘贴到浏览器的URL栏中,则返回的401会正确触发“基本身份验证”对话框。
有没有办法让AJAX回调告诉浏览器弹出那个对话框?
答案 0 :(得分:7)
使用您的网址动态创建iframe并附加到文档。它会触发身份验证表单。 jQuery snipet添加iframe
$('<iframe src="your_url"></iframe>').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
}
});
答案 1 :(得分:2)
您无法提供带有凭据的请求。
答案 2 :(得分:1)
您建议打开/显示/插入表单以允许插入用户名和密码,然后重新发送具有给定凭据的AJAX请求。我不会真的使用浏览器凭据弹出窗口。
如何设置您可以在此处阅读的身份验证标头:How to use Basic Auth with jQuery and AJAX?
答案 3 :(得分:1)
我遇到了几乎相同的401问题,除了我的请求是跨域的。但我希望原因是一样的。按照developer.mozilla - Access control CORS上的说明,我终于成功了:
var xhttp=new XMLHttpRequest();
xhttp.withCredentials = true;
xhttp.open("GET", "https://my.foo.server/app/resource", true);
xhttp.send();
我认为xhttp.withCredentials
是解决方案。它不是标题!您让浏览器通过cookie与服务器通信。以下答案解释了很多XHR2 withCredentials - which cookies are sent?
没有xhttp.withCredentials
,总有401 (Unauthorized)
。但是使用它时,浏览器添加了所需的标题Authorization:Basic dGVFooFooFooFoosaWVudA==
或触发了登录对话框,此时凭据尚未提供。
答案 4 :(得分:0)
在堆栈的某处找到了:
接收401响应是服务器告诉你,“你不是 经过身份验证 - 未经过身份验证或经过身份验证 不正确 - 但请重新认证,然后再试一次。“为了帮助你, 它将始终包含描述如何的WWW-Authenticate标头 认证
使用jQuery的var fs = require('fs');
var express = require('express');
var cors = require('cors');
var app = express();
app.use(cors());
app.use(express.static(path.join(__dirname, '../')));
app.get('/', function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
contents = fs.readFileSync('sliderImages.json', 'utf8');
res.end(contents);
});
app.listen(process.env.PORT || 8080);
回调添加带有身份验证信息的HTTP标头
beforeSend
答案 5 :(得分:0)
您是否符合this SO answer?
中突出显示的条件同样基于in this other answer,您可能需要检查从后端返回的标头是否相同,无论您是从浏览器还是从AJAX调用请求它。
答案 6 :(得分:0)
您可以在检查401条件时触发重定向:
window.location = "https://example.com"