代码之家  ›  专栏  ›  技术社区  ›  Steven Collins

WCF中的委派不起作用-第一个跃点是NTLM?

  •  0
  • Steven Collins  · 技术社区  · 13 年前

    我正在做一个项目,该项目需要在双跳场景中进行授权。我们有一个桌面客户端,使用net.tcp绑定连接到WCF服务,连接到另一台服务器上的SQL数据库。我们的目标是使用用户的凭据来访问SQL数据库。

    WCF服务和SQL数据库都在同一域用户下运行,该域用户已为SQL数据库启用委派。说明书 here 一直被跟踪,但没有成功。

    现在,我们的日志中记录了一些细节: 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。

    有什么建议吗?提前感谢!

    编辑: 我们发现了一些可能存在问题的东西——我们没有使用 端点标识.CreateSpnIdentity 在客户端上。设置后,我们收到错误 对SSPI的调用失败,内部异常为目标原则名称不正确。但是我们在客户端和服务器中设置的SPN是匹配的,并且都与服务的主机名相匹配。如果我们将客户端和服务器的SPN都设置为完全不同的值,或者如果客户端指定的SPN与服务器的SPN不匹配,则身份验证会像以前一样返回NTLM。我们已经对这个错误进行了研究,但找不到它的原因。有什么建议吗?

    我们还执行了这两种情况下的数据包捕获-回退到NTLM以及当我们收到“调用SSPI失败”错误时。在这两种情况下,都会发送和接收类似的数据包,直到其中一种情况下提到NTLM。另一方面,“TURN CHANNEL”数据包从客户端发送到服务器。在提到NTLM并发送用户名和计算机名之前,或者发送“TURN CHANNEL”数据包之前,数据包中除了服务器的IP地址之外,不包含任何人类可读的内容,其中包含似乎是SPN的内容,可能还有主机名。似乎没有任何人类可读的错误代码或错误消息。有什么建议吗?

    1 回复  |  直到 13 年前
        1
  •  0
  •   Steven Collins    13 年前

    我们发现了错误-客户端正在使用服务器的IP地址创建连接。将IP切换到完全限定的域名后,第一个跃点使用Kerberos进行一致的身份验证。

    IP地址解析为我们在两个SPN中使用的相同字符串,但我认为客户端在执行任何其他检查之前,会检查连接字符串是否与斜杠后面的SPN部分匹配。

    我们使用网络服务和域用户测试了结果,只要SPN分别注册到计算机或用户,就没有问题。

    希望这个答案能为其他人节省一些时间和麻烦!


    附加说明:虽然这为所有连接启用了Kerberos身份验证,但我们后来发现,在我们的情况下,这是不必要的。我们与数据库的部分连接不在模拟使用块内,这导致表读取失败。此后,我们删除了所有与委派和SPN相关的代码,数据库连接继续正常工作。我们的第一个跃点是使用NTLM。我们不完全确定凭据在SQL服务器上是如何使用的,因为我们的连接似乎正是所描述的双跳场景,这应该需要Kerberos和委派,但很难说什么是有效的。我怀疑这可能与代表团在 this document 以下为:

    当客户端使用与后端服务上的Windows帐户相对应的用户名和密码向前端服务进行身份验证时,前端服务可以通过重用客户端用户名和密码来向后端服务进行身份认证。这是一种特别强大的身份流形式,因为将用户名和密码传递给后端服务可以使后端服务执行模拟,但由于未使用Kerberos,因此不构成委派。Active Directory对委派的控制不适用于用户名和密码身份验证。

    如果有人对它起作用的原因有任何其他建议,我很乐意听取。然而,我觉得不值得再问一个问题。

    推荐文章