我通过XmlHttpRequest进行身份验证的Javascript代码如下所示:
function Login() { var request = GetRequest(); // retrieves XmlHttpRequest request.onreadystatechange = function() { if (this.status == 401) { // unauthorized request -> invalid credentials // do something to suppress NTLM dialog Box... // already tried location.reload(); and window.location = <url to authentication form>; } } request.open("GET","http://myServer",false,"domain\\username","password"); request.send(null); }
我不希望在用户提供无效凭据时显示NTLM对话框.相反,应该执行身份验证表单中的登录按钮的回发.换句话说,浏览器不应该发现我的未经授权的请求.
有没有办法通过Javascript这样做?
解决方法
我不确定我是否正确理解了问题描述,但我认为您正在尝试为SharePoint包装NTLM身份验证,这意味着您无法控制服务器端身份验证协议,对吗?如果您无法操纵服务器端以避免在失败的凭据上发送401响应,那么您将无法避免此问题,因为它是(客户端)规范的一部分:
If the UA supports HTTP Authentication [RFC2617] it SHOULD consider requests@H_404_20@ originating from this object to be part of the protection space that includes the@H_404_20@ accessed URIs and send Authorization headers and handle 401 Unauthorised requests@H_404_20@ appropriately. if authentication fails,UAs should prompt the users for credentials.
因此,如果在XMLHttpRequest中收到任何401响应,则规范实际上要求浏览器相应地提示用户,就像用户直接访问了URL一样.据我所知,据我所知,真正避免这种情况的唯一方法就是让你控制服务器端并避免401 Unauthorized响应.
最后一个想法是,您可以使用代理来解决这个问题,这是另一个Web服务器上的单独服务器端脚本.该脚本然后接受用户并传递参数并检查身份验证,以便用户的浏览器不是正在发出原始HTTP请求的内容,因此没有收到导致提示的401响应.如果以这种方式执行此操作,您可以从“代理”脚本中找到它是否失败,如果是,则再次提示用户,直到成功为止.在成功的身份验证事件中,您可以像现在一样简单地获取HTTP请求,因为如果正确指定了凭据,一切都可以正常工作.