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

dna*_*dna 4 asp.net authentication iis ajax jquery

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

我这里有两个问题.

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

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

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

编辑1

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

感谢大家.

Wik*_*hla 6

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

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

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

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

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