在3G上提示401,但在Wi-Fi上没有提示 - 使用基本身份验证的SSL上的XmlHttpRequest,硬编码凭据

时间:2013-07-11 14:08:42

标签: javascript ajax authentication ssl xmlhttprequest

我有一个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服务代理,如果这是我唯一的选择,我可以使用一些指导来实现非常简单。

1 个答案:

答案 0 :(得分:1)

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

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

xmlhttp.setRequestHeader('Authorization', auth);

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

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

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