在未经授权的请求后禁止NTLM对话框

Mar*_*ier 7 javascript asp.net sharepoint

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

我通过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);
}
Run Code Online (Sandbox Code Playgroud)

我不希望在用户提供无效凭据时显示NTLM对话框.相反,应该执行身份验证表单中的登录按钮的回发.换句话说,浏览器不应该发现我未经授权的请求.

有没有办法通过Javascript来做到这一点?

Jay*_*Jay 5

马克的评论是正确的;NTLM 身份验证提示由 401 响应代码和 NTLM 作为 WWW-Authenticate 标头中提供的第一种机制(参考:NTLM 身份验证协议)触发。

我不确定我是否正确理解了问题描述,但我认为您正在尝试为 SharePoint 包装 NTLM 身份验证,这意味着您无法控制服务器端身份验证协议,对吗?如果您无法操纵服务器端以避免在失败的凭据上发送 401 响应,那么您将无法避免此问题,因为它是(客户端)规范的一部分:

XMLHttpRequest 对象

如果 UA 支持 HTTP 身份验证 [RFC2617],它应该将源自该对象的请求视为保护空间的一部分,该空间包括访问的 URI,并发送授权标头并适当处理 401 未经授权的请求。如果身份验证失败,UA 应提示用户输入凭据。

因此,规范实际上要求浏览器在 XMLHttpRequest 中收到任何 401 响应时相应地提示用户,就像用户直接访问了 URL 一样。据我所知,真正避免这种情况的唯一方法是让您控制服务器端并避免 401 未经授权的响应,正如马克所说。

最后一个想法是您可以使用代理来解决这个问题,例如另一个网络服务器上的单独服务器端脚本。然后该脚本接受一个用户并传递参数并检查身份验证,因此用户的浏览器不是发出原始 HTTP 请求的原因,因此不会收到导致提示的 401 响应。如果你这样做,你可以从你的“代理”脚本中找出它是否失败,如果失败,然后再次提示用户,直到它成功。在成功的身份验证事件中,您可以像现在一样简单地获取 HTTP 请求,因为如果正确指定了凭据,则一切正常。