我有一个XmlHttpRequest,它使用基本身份验证的硬编码凭据。网站(HTML / CSS / JavaScript)本身已经使用客户端证书进行了身份验证,因此我宁愿在调用Web服务时使用匿名身份验证,但它会返回带有HTTP 200 / OK代码的空数据集。我也尝试使用与网站相同的客户端证书,但它也返回空数据集,尽管HTTP 200 / OK代码。当我将其设置为使用基本身份验证时,将返回完整的数据集。所以,似乎我可能会被困在使用Basic。这是一个简单的请求:
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('POST', 'https://foo.bar.com:5443/WebServices/Web.svc', true, username, password);
var sr = '<Envelope>' +
'<Body>' +
'<Method>' +
'<parameterlist>' +
'<parameter>param_1</parameter>' +
'</parameterlist>' +
'</Method>' +
'</Body>' +
'</Envelope>';
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
//successful
}
}
};
xmlhttp.setRequestHeader('SOAPAction', '\"http://SOAPAction\"');
xmlhttp.setRequestHeader('Content-Type', 'text/xml;charset=UTF-8');
xmlhttp.setRequestHeader('Cache-Control', 'no-cache');
xmlhttp.send(sr);
由于我在XHR中对凭证进行了硬编码,因此我通常会在日志中看到401,紧接着是正确的凭证请求,从而导致200状态。没有401挑战提示,这是我希望它工作的方式。例如(为便于阅读而编辑):
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2013-07-10 11:55:23 192.168.201.145 POST /WebService.svc - 5443 - IP_ADDRESS USER_AGENT 401 0 0 31
2013-07-10 11:55:24 192.168.201.145 POST /WebService.svc - 5443 USERNAME IP_ADDRESS USER_AGENT 200 0 0 296
然而,当我在3G连接上,或者当Wifi连接速度较慢时,我总是得到401挑战提示。我不确定为什么在较慢的连接上它会有所不同。理想情况下,401提示永远不会出现。
据我所知,解决此问题的一种方法是使用Web服务代理,但我找不到任何有关如何实现非常简单的代理的示例。我从来没有创建过Web服务代理,如果这是我唯一的选择,我可以使用一些指导来实现非常简单。
答案 0 :(得分:1)
我仍然不完全确定为什么会发生这种情况,但我能够使用发布的here方法修复它。
它只使用Base64.js从用户名和密码创建哈希,并将其传递给授权标头。
xmlhttp.setRequestHeader('Authorization', auth);
我从.open()中删除了用户名和密码:
xmlhttp.open('POST', 'https://foo.bar.com:5443/WebServices/Web.svc', true);
服务器根本不发送任何401挑战。它直接导致200状态,这意味着数据加载速度更快。