我有一个MVC Web应用程序,它应该允许用户下载在数据库中存储为UNC路径的文件。这些文件可以位于远程服务器/共享上的任意位置。
E.g。服务器1托管用于下载存储在服务器2上的文件的Web应用程序
我不想将这些文件夹的权限授予托管服务帐户,因为安全性应取决于用户有权访问的内容。因此,我正在尝试使用Impersonation来检索文件。
当我在本地机器上调试时,一切都很好。它冒充我的用户并下载文件。
当我部署到我的测试服务器时,我收到以下错误:
拒绝访问路径'\\ Server2 \ SharedFolder \ somefile.txt'
我尝试了this Microsoft link的各种作品,但运气不好。
我尝试过的情景:
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
?
答案 0 :(得分:0)
看起来这个问题主要是由于我使用Kerberos和SPN设置的。我解除了所有设置并重新注册了我的服务帐户,模拟最终正常运行。
现在的问题是它似乎只适用于Internet Explorer。 Chrome和MobileIron正在做一些不同的事情来阻止委派的ImpersonationLevel。那是whole other question ...