我正在开发一个需要在双跳场景中进行委派的项目。我们有一个桌面客户端,使用 net.tcp 绑定连接到 WCF 服务,连接到另一台服务器上的 SQL 数据库。我们的目标是使用用户的凭据来访问 SQL 数据库。
WCF 服务和 SQL 数据库都在同一个域用户下运行,该用户为 SQL 数据库启用了委派。已按照此处的说明进行操作,但没有成功。
现在,我们的日志中记录了一些详细信息: SQL 数据库上使用的登录名显示为运行 WCF 服务的用户,并使用 Kerberos。WCF 服务器上使用的登录名显示为客户端用户,但使用的是 NTLM。使用[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
或using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
导致命令在 WCF 服务器上作为客户端运行。这让我相信模拟工作正常。
那么,什么可能导致第一个跃点回退到 NTLM?我们怀疑这是 SPN 问题,但我们已将 WCF 服务和 SQL 服务的 SPN 注册到共享域用户。此外,按照上面列出的说明,我们已将 SQL 服务设置为受信任的域用户委派。
我们EndpointIdentity.CreateSpnIdentity
在 WCF 服务上使用了设置 SPN,这就是我们向域用户注册的 SPN。
有什么建议么?提前致谢!
编辑:我们发现了一些可能存在问题的东西——我们没有EndpointIdentity.CreateSpnIdentity
在客户端上使用过。设置后,我们收到错误“调用 SSPI 失败”,内部异常“目标原理名称不正确”。但是我们在客户端和服务端设置的 SPN 匹配,并且都匹配服务的主机名。如果我们将客户端和服务器 SPN 都设置为完全不同的值,或者如果客户端指定的 SPN 与服务器的 SPN 不匹配,则身份验证会像以前一样回退到 NTLM。我们已经对该错误进行了研究,但找不到其原因。有什么建议么?
我们还对这两种情况进行了数据包捕获——回退到 NTLM 以及当我们收到“调用 SSPI 失败”错误时。在这两种情况下,都会发送和接收类似的数据包,直到其中一个提到 NTLM。另一方面,“TURN CHANNEL”数据包从客户端发送到服务器。这些数据包不包含任何人类可读的内容,除了服务器的 IP 地址,直到提到 NTLM,发送用户名和计算机名称,或者发送“TURN CHANNEL”数据包,其中包含似乎是 SPN 的内容,可能还有主机名。似乎没有任何人类可读的错误代码或错误消息。关于在数据包中寻找什么有什么建议吗?