JQuery Ajax + Windows 身份验证 = 401 未经授权

标签 jquery asp.net ajax authentication iis

我正在处理的应用程序遇到 Ajax 问题。 Web 应用程序是用 ASP.NET 4.5 编写的,更具体地说,它是从 Visual Studio 2012 中的默认 MVC 示例应用程序派生的。该应用程序托管在本地 IIS 服务器上(不是 Express 版本),并且需要 Windows 身份验证(当前为 NTLM)出于安全原因,进行客户端模拟。

我有两个问题。

  1. 网站在浏览时正确验证客户端身份,但由于某些不明原因,每个 Ajax 调用都会因 401 未经授权错误而失败(它在使用匿名身份验证时工作,所以我猜凭据没有封装在请求中?! )。我还没有时间调查他们之间的沟通,但我相信这里的一位大师能够提供帮助。

  2. 最终,Windows 身份验证提供程序将迁移到 kerberos。关于这个 Ajax 问题有什么特别需要注意的吗?

如果您需要任何其他信息,请告诉我。

编辑 1

我觉得很愚蠢...重新启动 IIS 可以解决问题。有时 IT 是一种乐趣......

谢谢大家。

最佳答案

以下答案基于我对 NTLM/Kerberos 的理解以及对 XmlHttpRequest 如何重用浏览器已知信息的一些猜测。然而,我实际上并没有尝试重现您的场景,因此我很可能是错的。

好的,就这样吧。 NTLM session 是面向连接的协议(protocol)。这意味着,如果您的服务器不断返回“Keep-alive”并且客户端重复使用相同的连接,则无需再次进行身份验证握手。然而,正如连接关闭并再次打开一样,需要进行新的握手。只要这是请求服务器的浏览器,新的握手就会使用浏览器内存中缓存的凭据自动完成,即您在初始握手时提供的确切凭据。

这就是为什么我相信您的 ajax 调用不起作用 - 它可能只是打开一个新连接并需要新的握手(并且似乎由于某种原因它不会重用浏览器内存中缓存的凭据)。

但是,如果您切换到 Kerberos,这种情况应该会改变。 Kerberos 基于质询-响应模式,其中浏览器和服务器直接联系身份验证机构。然后,kerberos 将您的身份验证保存在带有票证的 http header 中。 header 很可能会自动附加到您的 AJAX 请求中。

请注意,与 NTLM 相反,Kerberos 仅当浏览器和服务器都可以联系身份验证机构时才起作用。这就是为什么通常在 IIS 中将“协商”设置为身份验证方案 - 首先尝试 Kerberos,然后如果浏览器无法直接使用身份验证权限,则切换回 NTLM。

关于JQuery Ajax + Windows 身份验证 = 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14481628/

相关文章:

javascript - 如何在jquery flot图中用字符串替换变量

javascript - ajax- 将 .php 调用(通过 url)放在主页中

javascript - ajax 调用内的循环 - 我对事件的顺序感到困惑

jquery - 如何获取下拉列表中选项的 $.data() ?

jquery - jquery 的 checkboxradio() 不起作用

javascript - JQ UI DatePicker - 时区

c# - 从后面的代码更改母版页

javascript - 通过 Web 方法在 Select2 (4.0.3) 中提供分页的点播列表

javascript - 如何在ajax done函数中检索函数变量

javascript - jquery 切换不起作用