2013-01-23 123 views
3

我正在面对我正在处理的应用程序出现Ajax问题。该Web应用程序是用ASP.NET 4.5编写的,它是从Visual Studio 2012中的默认MVC示例应用程序派生出来的。该应用程序驻留在本地IIS服务器上(不是快速版本),并且需要Windows身份验证(当前为NTLM)对于安全原因的客户端模仿。JQuery Ajax + Windows身份验证= 401未授权

我在这里有2个问题。

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

  2. 最后,Windows身份验证提供程序将被移动到Kerberos。关于这个Ajax问题有什么特别要小心?

如果您需要任何其他信息,请让我知道。

编辑1

我觉得愚蠢...重新启动IIS解决问题。有些IT很高兴...

感谢大家。

+0

它可能是一个浏览器问题。你使用的是什么浏览器?我不知道Windows身份验证,但我知道从使用Firefox执行Kerberos的经验,你必须添加一些配置条目到浏览器才能正常工作。 –

+0

Chromium22和IE8都具有相同的行为。是的,我也使用--auth-server-whitelist来调用铬,但是这对于以后的版本来说也是如此。我会谷歌一点,这是一个好主意,谢谢。 – dna

+0

你曾经解决过这个问题吗?我遇到了一个非常类似的问题。在收到带有WWW-Authenticate 401的401后,Chrome不会进行协商:通过AJAX请求进行协商。 – jmh

回答

6

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

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

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

但是,如果您切换到Kerberos,这应该会改变。 Kerberos基于挑战 - 响应模式,浏览器和服务器直接与身份验证授权机构联系。然后,kerberos使用一张票保持您的http头上的身份验证。标题将被自动添加到您的AJAX请求中。

请注意,与NTLM相反,只有在浏览器和服务器都可以联系身份验证权限的情况下,Kerberos才能正常工作。这就是为什么通常在IIS中将“Negotiate”设置为身份验证方案的原因 - 这会首先尝试Kerberos,然后在验证权限不直接提供给浏览器的情况下切换回NTLM。

+0

是的,这可能是由于一个无效的KeepAlive设置,我会尽快查看交通情况。谢谢。 – dna

相关问题