我有一个使用硬编码凭据进行基本身份验证的 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 服务代理,如果这是我唯一的选择,我可以使用一些指导来实现非常简单的实现。