无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务

Posted

技术标签:

【中文标题】无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务【英文标题】:Cannot access backend WCF services via a web app using Kerberos Constrained Delegation through Safari 【发布时间】:2012-09-13 05:46:37 【问题描述】:

我有一个场景,其中托管在 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 都可以正常工作。

【问题讨论】:

您是否在wireshark中检查过Safari是否发送了可委托/可转发的票证? Safari 确实发送了一个令牌,但它是一个基于 NTLM 的令牌。是否需要对 Safari 执行任何配置才能使其正常工作?顺便说一句,Firefox 和 Chrome 可以正常工作。 如果 Safari 在 Windows 上使用 SSPI 并发送 NTLM 令牌,则您的 Kerberos 设置已损坏。我已经在 *** 上多次回答过这类问题。请搜索,您将找到解决方案。 现在这很奇怪——我又做了几次测试,有时会出现一个 Kerberos 令牌,但我仍然遇到同样的错误。我又运行了 20 次测试,大部分时间都有 Kerberos 令牌,但有 4 个实例出现了 NTLM 令牌。 使用 Wireshark 分析失败,你就会明白为什么 Kerberos 失败了。 【参考方案1】:
    在 Wireshark 中检查 Safari 是否发送可委托/可转发的票证。 是否可以直接访问后端服务?是否开启了凭证委托,我猜票是不可委托的? Safari 必须要求这样做。 Firefox 和 IE 可以。传递的 NTLM 令牌是来自您的服务器的令牌。 NTLM 中没有委派支持。目标主机有问题。

【讨论】:

【参考方案2】:

查看 Wireshark 跟踪信息,似乎 Safari 正在请求不可转发的 Kerberos 票证。由于这个标志,Kerberos 票证不会被转发/委派到下一个跃点,导致身份验证回退到 NTLM 并失败。

与 IE、Firefox 和 Chrome 请求的 TGS 请求相比,它们都设置了可转发标志。

我还尝试在 Mac OS X 中执行 klist -F 来检索可转发的票证,但 Safari 仍会请求没有可转发标志的单独票证。

这让我得出结论,Mac 上的 Safari支持委派。

【讨论】:

感谢您的更新。您应该向 Apple 提交错误。在 Firefox 中,您可以控制是否要委托。假设您的目标主机有资格进行委派。你可能会支持我的 cmets。 我似乎无法为 cmets 投票,当我将鼠标悬停在您的 cmets 上时,我看不到箭头。是因为我的代表吗? 这可能是原因。我已经将主要部分放在了答案中。我的第一条评论已经假定了错误。

以上是关于无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 微服务在 Pivotal Cloud Foundry 平台上部署时无法通过 Kerberos 身份验证

ApacheDS 和 Kerberos 设置

HTML5 视频背景无法在 iPhone 上播放 Safari

使用 pymssql 的 Kerberos 委派(双跳)

Kerberos无法使用Chrome

Janusgraph 库无法在 kerberos 环境中与 hbase 通信(无法指定服务器的 Kerberos 主体名称)