0

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

4

1 回答 1

1

我仍然不完全确定为什么会发生这种情况,但我能够使用此处发布的方法修复它。

它只是使用 Base64.js 从用户名和密码创建哈希,并将其传递到授权标头中。

xmlhttp.setRequestHeader('Authorization', auth);

我从 .open() 中删除了用户名和密码:

xmlhttp.open('POST', 'https://foo.bar.com:5443/WebServices/Web.svc', true);

服务器根本不发送任何 401 挑战。它直接导致 200 状态,这意味着数据加载速度更快。

于 2013-07-12T22:38:20.493 回答