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

时间:2013-01-23 14:05:13

标签: jquery asp.net ajax authentication iis

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

我在这里有两个问题。

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

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

  3. 如果您需要任何其他信息,请与我们联系。

    修改1

    我觉得很蠢......重启IIS解决了这个问题。有一天,IT很高兴......

    感谢大家。

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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