【问题标题】:JQuery Ajax + Windows Authentication = 401 UnauthorizedJQuery Ajax + Windows 身份验证 = 401 未经授权
【发布时间】:2013-01-23 14:05:12
【问题描述】:

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

我有两个问题。

  1. 网站在浏览时正确地验证了客户端,但由于某种模糊的原因,每次 Ajax 调用都失败,出现 401 Unauthorized 错误(它在使用匿名身份验证时工作,所以我猜凭据没有封装在请求中?! )。我还没有时间调查他们之间的交流,但我相信这里的一位大师能够提供帮助。

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

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

编辑 1

我觉得自己很愚蠢……重新启动 IIS 解决了这个问题。有时 IT 是一种乐趣......

谢谢大家。

【问题讨论】:

  • 可能是浏览器问题。你使用的是什么浏览器?我不确定 Windows 身份验证,但我从使用 Firefox 执行 Kerberos 的经验中知道,您必须向浏览器添加一些配置条目才能使其正常工作。
  • Chromium22 和 IE8 的行为相同。是的,你是对的,我也用 --auth-server-whitelist 调用 chromium ,但无论如何都是为了以后。我会用谷歌搜索一下,这是个好主意,谢谢。
  • 你解决过这个问题吗?我遇到了一个非常相似的问题。 Chrome 在收到带有 WWW-Authenticate:Negotiate from an AJAX 请求的 401 后不进行协商。
  • 是的,我只是重新启动了 IIS。还要确保清空浏览器缓存。
  • 关于 jQuery 调用服务的身份验证问题有很多问题 - 开始怀疑这是否是 jQuery 错误。首先在这里检查一些基本的第一步:stackoverflow.com/a/47916916/5196274

标签: jquery asp.net ajax authentication iis


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 是的,这可能是由于 KeepAlive 设置无效,我会尽快深入了解流量。谢谢。
猜你喜欢
  • 2018-07-09
  • 2018-01-23
  • 2013-08-09
  • 2011-11-03
  • 2013-02-06
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多