我继承了一个使用模拟连接到数据库的WCF Web服务,同时尝试运行自动化测试我注意到任何这些服务器的测试实例都失败了401响应。
使用Fiddler捕获响应我能够看到它正在尝试使用NT AUTHORITY\ANONYMOUS LOGON
打开数据库连接。
我最终得到远程调试设置并在连接打开之前立即断开指针,我使用立即窗口检查当前主体,这里是结果:
?System.Security.Principal.WindowsIdentity.GetCurrent().Name
"myDomain\myUser"
这正如我所期待的那样。在此之后,我检查了连接字符串的内容,它是:
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 AUTHORITY\NETWORK SERVICE"
但是,这次401错误报告用户myDomain\myDevServer
没有权限。
该服务在IIS 7上的网络服务下运行,这是预期的。虽然我确实尝试在域用户下运行,但看到了完全相同的结果:SQL尝试使用NT AUTHORITY\ANONYMOUS LOGON
我的问题与this question遇到的问题密切相关。 然而,使用相同的即时窗口技术,我验证了我的模仿级别,这确实是委托:
?System.Security.Principal.WindowsIdentity.GetCurrent().ImpersonationLevel
Delegation {4}
那么什么会导致受信任的sql连接获得与当前主体中显示的完全不同的用户?
更新
我已验证DC上的设置,机器帐户已配置为无约束委派,而我的用户帐户未标记为敏感。
我也逐步完成了this article我注意到在双跃点部分他说应该启用ASP.NET模拟身份验证提供程序,但这样做会导致服务器立即返回500,它永远不会它进入托管代码。
其他信息:
所有服务都应用[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
属性,web.config文件具有<serviceAuthorization impersonateCallerForAllOperations="true" />
这些服务既有用于restful调用的webHttpBinding,也有用于soap调用的basicHttpBinding,两个端点都遇到同样的问题。
答案 0 :(得分:2)
尝试在模拟上下文中对远程资源进行身份验证需要委派。遵循Delegation and Impersonation with WCF中的代表团准则(这些步骤需要域管理员):
在域控制器上,清除运行客户端应用程序的帐户的“帐户敏感且无法委派”复选框。
在域控制器上,选中运行客户端应用程序的帐户的“委派信任帐户”复选框。
在域控制器上,通过单击“信任计算机以进行委派”选项,配置中间层计算机以使其受信任以进行委派。
- 醇>
在域控制器上,通过单击“信任此计算机以仅委派给指定服务”选项,将中间层计算机配置为使用约束委派。
如果您在Windows Server 2012环境下更加容易,请参阅How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation。
如果您想了解有关此问题的更多信息,可以使用google for&#34; Kerberos double hop&#34;你会找到一大堆资源,包括SO上的许多答案。
最可能的原因是配置错误的SQL服务主体名称(SPN)。当直接连接到SQL时(例如,从Management Studio),错误配置的SPN会导致回退到NTLM(即,它不会被注意到)。但是在委托情况下,不允许回退,这会导致身份验证失败,因此授权是针对匿名登录完成的,完全如OP中所示。 SQL Server Kerberos and SPN Quick Reference是一个很好的资源。