我有一个场景,其中托管在 IIS 7/Windows 2008 中的 ASP.NET MVC 3 Web 应用程序正在从另一台服务器访问 WCF Web 服务,该服务器也托管在 IIS/Windows 2008 中。KCD 是在两台服务器之间设置的,我有必要的也设置了 SPN。
我已经确认这在 IE 中工作。使用 NetMon,我还确认 KCD 在后端工作。我的 Web 应用程序在机器帐户(网络服务)下运行,并且为此机器帐户相应地设置了 SPN。问题是当我在 Windows 和 Mac OS X (Lion) 机器上使用Safari时,我收到 401 Unauthorized 错误:
HTTP 请求未经客户端身份验证方案“协商”的授权。从服务器收到的身份验证标头是“协商,NTLM”。
查看 NetMon,它失败了,因为对 WCF Web 服务的请求正在回退到 NTLM。
请注意,Windows 和 Mac 机器都是我们域的一部分,并且我在两台机器上都使用相同的 Windows 凭据。
我知道 Safari 支持 Kerberos 身份验证,但是从我的 Web 应用程序委派到 WCF 服务时似乎存在问题。是 Safari 还是 WCF 的问题?
提前致谢!
更新:
在 Mac 上的 Safari 中,当我第一次访问 Web 应用程序时,我可以在 Wireshark 和 NetMon 中看到通过 HTTP 请求传递的有效 Kerberos 令牌(我没有收到 401 Unauthorized 错误)。但是当我的 Web 应用程序尝试访问后端 Web 服务时,我可以在那个特定的 HTTP 请求中看到正在传递的令牌现在是一个 NTLM 令牌。
我使用带有 TransportCredentialOnly 的 basicHttpBinding 作为安全模式——我还在 web.config 中指定了后端 Web 服务端点的 SPN 身份(后端 Web 服务服务器的 HTTP/FQDN)。Windows Auth 当然在两个 IIS 站点上启用,“使用内核模式”打开,并且在两个站点的 appHost.config 上将 useAppPoolCredentials 设置为 true。同样,这仅适用于 Mac 上的 Safari,Firefox 和 Chrome 都可以正常工作。