【问题标题】:Impersonate user to access file on remote server - Access denied模拟用户访问远程服务器上的文件 - 访问被拒绝
【发布时间】:2018-04-23 19:46:52
【问题描述】:

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

例如服务器 1 托管用于下载存储在服务器 2 上的文件的 Web 应用程序

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

当我在本地机器上调试时,一切正常。它会模拟我的用户并下载文件。

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

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

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

我尝试过的场景:

  1. 仅授予 AppPool 的服务帐户权限可以正常工作,但正如我所说,并不理想
  2. 实现上述文章中的在代码中模拟特定用户,它与硬编码的用户和密码完美配合。这种情况也不理想。
  3. 实现上述文章中的在代码中模拟身份验证用户。这似乎正是我所需要的,但这就是产生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


【解决方案1】:

问题似乎主要是由于我使用 Kerberos 和 SPN 进行的设置。我撤消了所有设置并重新注册了我的服务帐户,并且模拟最终正常工作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多