【发布时间】:2018-04-23 19:46:52
【问题描述】:
我有一个 MVC Web 应用程序,它应该允许用户下载作为 UNC 路径存储在数据库中的文件。这些文件可以位于远程服务器/共享上的任意数量的位置。
例如服务器 1 托管用于下载存储在服务器 2 上的文件的 Web 应用程序
我不想将这些文件夹的权限授予托管服务帐户,因为安全性应取决于用户有权访问的内容。因此,我试图使用模拟来检索文件。
当我在本地机器上调试时,一切正常。它会模拟我的用户并下载文件。
当我部署到我的测试服务器时,我收到以下错误:
拒绝访问路径“\\Server2\SharedFolder\somefile.txt”
我尝试了this Microsoft link 的各种作品,但运气不佳。
我尝试过的场景:
- 仅授予 AppPool 的服务帐户权限可以正常工作,但正如我所说,并不理想
- 实现上述文章中的在代码中模拟特定用户,它与硬编码的用户和密码完美配合。这种情况也不理想。
- 实现上述文章中的在代码中模拟身份验证用户。这似乎正是我所需要的,但这就是产生
Access Denied错误的原因。
我想要工作的代码:
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext =
((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
//Code to read all bytes from the file path
impersonationContext.Undo();
我有日志记录,并且System.Security.Principal.WindowsIdentity.GetCurrent().Name 在模拟后确实返回了预期的用户(我的帐户而不是服务帐户),所以它似乎确实在工作。
我认为这可能是双跳的事情,所以我还为服务器和服务帐户添加了 SPN,确保它们在 AD 中的委派设置为允许任何服务。那也没有帮助。
This question 似乎和我有完全相同的问题,但没有跟进最终解决方案是什么。我确实尝试了 Process Monitor 部分,但它根本没有帮助。
我不知道为什么模拟似乎在起作用,但我被拒绝访问第二台服务器上的文件。
更新 1 我对 IIS 设置进行了更多尝试,并尝试正确设置 Kerberos。我的 IIS 身份验证中唯一启用的是“Windows 身份验证”。
当我在Impersonate() 通话后吐出详细信息时,我发现ImpersonationLevel = Impersonation
应该是这样,还是应该返回Delegation?
【问题讨论】:
-
我认为这两个链接都与我帖子中 Microsoft 链接中的内容相似。您拥有用户名和密码的那个不起作用,因为我不想提示我的用户。第一个似乎与我在第三个实现中的类似。有些东西阻止它工作,我不知道是什么。
标签: c# asp.net asp.net-mvc impersonation iis-8.5