如何从AJAX调用触发浏览器的“基本身份验证”对话框?

时间:2014-11-10 17:42:15

标签: javascript ajax wcf basic-authentication wcf-security

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

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

有没有办法让AJAX回调告诉浏览器弹出那个对话框?

7 个答案:

答案 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)

您无法提供带有凭据的请求。

请参阅How to use Basic Auth with jQuery and AJAX?

答案 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"