模拟用户访问远程服务器上的文件 - 拒绝访问

时间:2018-04-23 19:46:53

标签: c# asp.net asp.net-mvc impersonation iis-8.5

我有一个MVC Web应用程序,它应该允许用户下载在数据库中存储为UNC路径的文件。这些文件可以位于远程服务器/共享上的任意位置。

  

E.g。服务器1托管用于下载存储在服务器2上的文件的Web应用程序

我不想将这些文件夹的权限授予托管服务帐户,因为安全性应取决于用户有权访问的内容。因此,我正在尝试使用Impersonation来检索文件。

当我在本地机器上调试时,一切都很好。它冒充我的用户并下载文件。

当我部署到我的测试服务器时,我收到以下错误:

  

拒绝访问路径'\\ Server2 \ SharedFolder \ somefile.txt'

我尝试了this Microsoft link的各种作品,但运气不好。

我尝试过的情景:

  1. 只是给AppPool的服务帐户授权工作正常,但正如我所说,并不理想
  2. 从上面的文章中实现模拟代码中的特定用户,它与硬编码的用户和密码完美配合。这种情况也不理想。
  3. 从上面的文章中实现模拟代码中的身份验证用户。这似乎正是我所需要的,但这就是产生Access Denied错误的原因。
  4. 我想要的代码:

    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

1 个答案:

答案 0 :(得分:0)

看起来这个问题主要是由于我使用Kerberos和SPN设置的。我解除了所有设置并重新注册了我的服务帐户,模拟最终正常运行。

现在的问题是它似乎只适用于Internet Explorer。 Chrome和MobileIron正在做一些不同的事情来阻止委派的ImpersonationLevel。那是whole other question ...