3

我有一个在服务器 A 上运行的 Web 应用程序,它调用服务器 B 上的 WCF 服务(K2 工作流),需要模拟/委托才能作为调用用户运行。如果我从服务器 A 运行 Web 应用程序,该应用程序运行良好。如果我在调试中从本地 PC 运行应用程序,它也很好用。如果我从 PC 上的浏览​​器将应用程序点击到服务器 A,我会收到以下错误:

HTTP 请求未经客户端身份验证方案“Ntlm”授权。从服务器收到的身份验证标头是“Ntlm,Negotiate”。System.Net.WebException:远程服务器返回错误:(401)未经授权。在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时)。

我使用以下代码运行服务:

SvcWorklist.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;
SvcWorklist.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;

我觉得我已经完成了一切,这是我尝试过的列表:

  1. 通过服务器 A 应用程序池域用户设置 SPN(包括端口)到服务器 B(NETBIOS 和 FQDN)
    1. 在服务器 A 和 B 上设置与应用程序池用户相同的域用户
    2. 确保允许应用程序池用户在 Active Directory 中委派
    3. 确保两台服务器都允许在 AD 中委派
    4. 在服务器 A 上的 web.config 中将身份验证设置为 windows 和 impersonate=true
    5. 确保 Thread.CurrentPrincipal.Identity.Name 有我的用户 ID
    6. 确保为 Windows 和模拟设置了 IIS
    7. 尝试将服务器 A 和 B 上的 IIS 配置限制为仅 Ntlm 和/或协商

任何帮助或想法都非常感谢。

4

1 回答 1

0

对于有同样问题的家伙 - 我想通了。我在目标服务上设置了 SPN,而不是它托管的服务。我还需要设置共享点以使用协商与 ntlm。

于 2013-10-09T20:35:12.473 回答