我有一台运行 SQL Server 的生产服务器,我将其称为CONTOSO\MachineA
。我有一台运行 IIS 的开发服务器,我将其称为CONTOSO\MachineB
。两台服务器都运行 Windows Server 2008。我有一个域用户,我将其称为CONTOSO\MyAppSvc
。我有两个 CNAME 记录,myapp => MachineA
和myappdev => MachineB
。
我的目标是让(内部网)客户端连接到 IISMachineB
并通过 Windows 身份验证进行身份验证,然后让应用程序模拟它们并MachineA
以自己的身份连接到 SQL。
SELECT * FROM [MachineA].[My App DB].App.SomeTable
MachineB 正在运行 SQL Server 的另一个实例,用于测试,并且我已通过运行验证 SQL 已正确设置双跳身份验证SSMS (on MyWorkstation) => SQL Server (on MachineB) => SQL Server (on Machine A)
。
MyApp
在 IIS 上,MachineB
设置了模拟和 Windows 身份验证(仅协商),并且正在MyAppPool
运行,其中以 的身份运行MyAppSvc
。system.webServer/ security/ authentication/ windowsAuthentication @useAppPoolCredentials
为真,@useKernelMode
为假。MachineB
和MyAppSvc
都受信任,可以进行无约束委派。上有两个 SPN MyAppSvc
:HTTP/myapp
和HTTP/myapp.contoso.local
。
使用 wireshark,当我尝试浏览时,我看到以下内容http://myapp/aPage
:
- 我的工作站 => 机器 B
- 获取/aPage
- 主机:myapp
- 机器B => 我的工作站
- 401 未授权
- WWW-身份验证:协商
- 我的工作站 => 机器 B
- 获取/aPage
- 主机:myapp
- 授權: 票证:
- 领域:CONTOSO.LOCAL
- sname:HTTP/MachineB.Contoso.local
- 机器B => 我的工作站
- 401 未授权
- WWW 认证:
- 错误代码:ERR-MODIFIED
- 领域:CONTOSO.LOCAL
- 名称:MyAppSvc
答案1
问题在于 DNS 条目是 CNAME 记录而不是 A 记录,而且 SPN 是针对主机名MyApp
而不是机器名设置的MachineB
。解决方案是将 DNS 条目更改为MyApp
直接指向 IP 地址的 A 记录,MachineB
或者添加 SPNHTTP/MachineB
和HTTP/MachineB.Contoso.local
(旧的 SPN 和可能会被删除)。