我知道关于这个主题的文章已经有十几篇了,但由于某种原因我一直无法找到解决方案。
服务器 WEB1 具有 IIS7.5,其站点使用 Windows 身份验证(内核模式关闭,提供程序:“negotiate:kerberos”),并且 AppPool 作为 NETWORK SERVICE 运行并处于集成模式。
模拟工作正常,但委托给另一台提供 CIFS 的服务器 STORAGE1 却不行。
当我尝试访问位于那里的 UNC 时出现权限错误。
AD 中的 WEB1 计算机对象已配置为委派“信任此计算机委派任何服务(仅 Kerberos)”,并且我还尝试了“仅信任此计算机委派指定服务:仅用户 Kerberos”服务“CIFS/STORAGE1”和“HOST/STORAGE1”(我知道 cifs 包含在主机中,我认为同时使用两者不会有害),并选择“扩展”以包含 CIFS 和 HOST 服务的 FQDN。
我捕获了一个从 WEB1 到 STORAGE1 失败的文件操作的数据包,看起来身份验证消息仅包含主机名 WEB1。
我创建了一个测试共享,并为 EVERYONE 帐户授予了共享级别和 NTFS 级别的完全访问权限,但我仍然收到访问被拒绝错误消息。
我曾尝试使用调试 V2。虽然我可以将对 WEB1 的模拟全部勾选,但无法验证到 STORAGE1 的第二跳,并且委派级别仅为“模拟”。
此时我确实需要部署此应用程序,因此我很乐意在尝试找到根本原因的同时使用任何解决方法。
如果您有任何贡献(建议、问题、任何事情)我将不胜感激。
帮助我,SF,你是我唯一的希望!
编辑:如果它有帮助,模拟经过身份验证的用户对 STORAGE1 进行文件操作的代码如下所示:
WindowsImpersonationContext imp = ((WindowsIdentity)User.Identity).Impersonate();
FileInfo fi = Classes.File(id.Value);
bool dir = fi.Directory.Exists;
bool file = fi.Exists;
imp.Undo();
答案1
好的。我想我明白了。
- AD 中的计算机对象委派设置为“信任这台计算机委派任何服务(仅限 Kerberos)。
- 为 HTTP 的虚拟主机 FQDN 添加了 SPN。
- AppPool 身份为“ApplicationPoolIdentity”,而不是网络服务。
- 配置浏览器信任区域以包含网络主机。(非常重要)
我们遇到了一些其他无法解释的事情,这导致我们将 WEB1 从域中删除并以 WEB2 的身份重新加入。
还值得一提的是,没有添加任何额外的 SPN 来允许访问 STORAGE1。