在最近的sharepoint项目中,我实现了一个身份验证Web部件,该部件应替代NTLM身份验证对话框。只要用户提供有效的凭据,它就可以正常工作。每当用户提供无效的凭据时,NTLM对话框就会在Internet Explorer中弹出。

我的Javascript代码通过XmlHttpRequest进行身份验证,如下所示:

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做到这一点?

最佳答案

Mark的评论是正确的; NTLM身份验证提示由401响应代码和作为WWW-Authenticate header (引用:The NTLM Authentication Protocol)中提供的第一种机制的NTLM的存在触发。
我不确定我是否正确理解了问题描述,但是我认为您正在尝试为SharePoint包装NTLM身份验证,这意味着您无法控制服务器端身份验证协议(protocol),对吗?如果您无法操纵服务器端以避免在失败的凭据上发送401响应,那么您将无法避免此问题,因为它是(客户端)规范的一部分:
The XMLHttpRequest Object

因此,该规范实际上要求浏览器在XMLHttpRequest中收到任何401响应时相应地提示用户,就像用户直接访问URL一样。据我所知,真正避免这种情况的唯一方法是让您控制服务器端并避免401未经授权的响应,如Mark所提到的。
最后一个想法是,您可以使用代理来解决此问题,例如在另一台Web服务器上使用单独的服务器端脚本。然后,该脚本将接收用户并传递参数并检查身份验证,以便用户的浏览器不是原始HTTP请求的发出者,因此不会收到引起提示的401响应。如果以此方式进行操作,则可以从“代理”脚本中查找失败的脚本,如果失败,则再次提示用户直到成功。在成功的身份验证事件中,您可以像现在一样简单地获取HTTP请求,因为如果正确指定了凭据,一切都会正常进行。

关于asp.net - 在未经授权的请求后禁止NTLM对话框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29680/

10-12 00:05