36

我在从 Web 应用程序中调用 Web 服务时遇到了一些问题,我希望这里的人能够提供帮助。据我所知,这似乎与 Kerberos双跳问题有关。但是,如果是这样,我不确定该怎么做才能真正解决问题。为了让事情变得更难,我没有适当的权限来更改 Active Directory 帐户,因此我需要知道在请求更改时要求什么。在我的情况下,我需要将凭据(集成 Windows 身份验证)从 Web 应用程序传递到后端 Web 服务,以便 Web 服务在正确的用户上下文下运行。

这是我的确切问题:

这有效

工作场景

这不起作用

非工作场景

工作场景和非工作场景之间的唯一区别是工作场景在本地主机上运行应用程序(无论是开发人员的 PC 还是在相关服务器上),而非工作示例在另一台机器上运行两种场景之间的代码完全相同。

我试过的

  1. 将 SPN 添加到为每个服务器运行应用程序池的域帐户setspn -a http/server1 DOMAIN\account
  2. 不同的模仿方法
  3. 删除模拟代码using(...)并作为应用程序池帐户执行 Web 服务调用。这按预期工作。

有没有人知道我可以做些什么来解决这个问题?

4

2 回答 2

18

必须信任中间服务器才能进行委派。否则,将不会委托任何凭证,并且中间服务器无法模拟原始客户端。

于 2013-02-19T19:22:46.893 回答
4

通常原因是服务器 1 没有将委托令牌传递给服务器 2。因此,当服务器 2 尝试使用该身份验证票证前往其他地方(可能是 SQL 服务器)时,它会失败。

您应该为 WCF 调用设置模拟级别

ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation

http://msdn.microsoft.com/en-us/library/system.servicemodel.security.windowsclientcredential.allowedimpersonationlevel.aspx

于 2013-02-19T17:10:19.363 回答