Windows标识模拟未持久化到Sql受信任的连接中



我继承了一个WCF web服务,该服务使用模拟连接到数据库,在尝试运行自动测试时,我注意到任何命中服务测试实例的测试都失败了,并返回401响应。

使用Fiddler捕获响应,我可以看到它正试图使用NT AUTHORITYANONYMOUS LOGON打开数据库连接。

我最终在连接打开前立即获得了远程调试设置和断点,并使用即时窗口检查当前主体,结果如下:

?System.Security.Principal.WindowsIdentity.GetCurrent().Name
"myDomainmyUser"

这正是我所期望看到的。之后,我检查了我们的连接字符串的内容,它是:

Data Source=myDbServer;Initial Catalog=devDb;Integrated Security=True;User ID=;Password=;Asynchronous Processing=False;Connect Timeout=300;Application Name=myApp

这也是人们所期望的。

我的下一步是禁用模拟,看看当时用户试图连接的是什么:

?System.Security.Principal.WindowsIdentity.GetCurrent().Name
"NT AUTHORITYNETWORK SERVICE"

然而,这一次401错误报告用户myDomainmyDevServer没有权限。

该服务在IIS 7上的网络服务下运行,这是预期的。虽然我确实尝试过让它在域用户下运行,但看到了完全相同的结果:SQL尝试使用NT AUTHORITYANONYMOUS LOGON登录

我的问题与在这个问题上所经历的问题密切相关。然而,使用相同的即时窗口技术,我验证了我的模拟级别,这确实是委托:

?System.Security.Principal.WindowsIdentity.GetCurrent().ImpersonationLevel
Delegation {4}

那么,是什么导致受信任的sql连接获得与当前主体中显示的用户完全不同的用户呢?

更新:

我已经验证了DC上的设置,机器帐户配置为无约束委派,并且我的用户帐户未标记为敏感。

我还仔细阅读了这篇文章,我注意到在双跳部分,他说应该启用ASP.NET模拟身份验证提供程序,但这样做会导致服务器立即返回500,它永远不会将其转换为托管代码。

附加信息:

所有服务都应用了[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]属性,web.config文件具有<serviceAuthorization impersonateCallerForAllOperations="true" />

这些服务同时具有用于restful调用的webHttpBinding和用于soap调用的basicHttpBinding,这两个端点都遇到了相同的问题。

试图在模拟上下文下对远程资源进行身份验证需要委派。遵循WCF委派和模拟中的委派指南(这些步骤需要域管理员):

  1. 在域控制器上,清除运行客户端应用程序的帐户的"帐户是敏感的,不能委派"复选框。

  2. 在域控制器上,为运行客户端应用程序的帐户选中"委派信任帐户"复选框。

  3. 在域控制器上,通过单击"信任计算机进行委派"选项,配置中间层计算机,使其受信任进行委派。

  4. 在域控制器上,通过单击"仅信任此计算机委派给指定的服务"选项,将中间层计算机配置为使用约束委派。

如果您所处的Windows Server 2012环境在某种程度上更容易,请参阅Windows Server 2012如何缓解Kerberos受限委派的痛苦。

如果你想了解更多关于这个问题的信息,在谷歌上搜索"Kerberos双跳",你会发现大量的资源,包括SO.上的许多答案

最有可能的原因是配置错误的SQL服务主体名称(SPN)。当直接连接到SQL(例如从Management Studio)时,配置错误的SPN会导致回退到NTLM(即不会被注意到)。但在委派的情况下,不允许回退,这会导致身份验证失败,因此授权是针对匿名登录进行的,正如OP中所示。SQL Server Kerberos和SPN快速参考是一个很好的资源。

相关内容