【问题标题】:Read local file as local system, not as current user以本地系统读取本地文件,而不是当前用户
【发布时间】:2020-04-08 20:07:18
【问题描述】:

我有一个在 IIS 上运行的 ASP.NET C# 应用程序。

某些操作需要我使用Directory.EnumerateFiles 读取系统本地放置的文件。这在我调用该函数时有效,因为我的 windows 用户可以访问这些文件,但当另一个用户调用同一页面时它不会。

我检查了WindowsIdentity.GetCurrent().Name,我确实看到CompanyName\MyName 是当前用户。这些文件包含敏感数据,我不希望向所有用户授予读取权限,即使他们在远程系统上。

在我看来,我想专门授予我的 IIS 应用程序读取文件夹的权限,并以某种方式从 IIS 应用程序调用函数 Directory.EnumerateFiles,而不是从执行请求的当前用户(授权已在应用程序本身)。

这是否可行,如果可行,如何实现?


解决方案

我最终使用了这个答案:Can I turn off impersonation just in a couple instances:

using (WindowsIdentity.Impersonate(IntPtr.Zero))
{
 //Directory.EnumerateFiles(...)
 //File.ReadAllText(...)
}

另外,我授予以下用户访问该文件夹的权限:IIS APPPOOL\MyAppPoolName


【问题讨论】:

  • 所以您希望始终使用ApplicationPoolIdentity 阅读文件,对吗?
  • 文件是否在 Web 服务器的本地文件系统上?如果是这样,您可以授予对 IIS_IUSRS 帐户的读取权限。
  • @HariHaran 是的,这是正确的
  • @AndrewMorton 他们确实是本地文件,我可以试试这个
  • @AndrewMorton 我刚刚测试了这个,但不幸的是它不起作用。不过还是谢谢

标签: c# asp.net iis


【解决方案1】:

您必须使用某种模拟。你可以在这里找到选项:https://support.microsoft.com/en-us/help/306158/how-to-implement-impersonation-in-an-asp-net-application

模拟经过 IIS 验证的帐户或用户

为 ASP.NET 应用程序的所有请求模拟特定用户

在代码中模拟身份验证用户 在代码中模拟特定用户

所有请求的示例配置

<identity impersonate="true" 
          userName="domain\user"  
          password="password" />

域用户应具有所需的访问权限。

如果您想使用第三个选项,请检查this answer here,它使用以下内容来模拟每个代码块:

try
{
    if (!WindowsIdentity.GetCurrent().IsSystem)
    {
        using (WindowsIdentity.Impersonate(IntPtr.Zero))
        {
          // Do stuff here
        }
    }
}
catch { }

【讨论】:

  • 这似乎是正确的做法。我赞成您的回答,直到尝试,确认它是否有效后我会接受它。谢谢Athanasios
  • 我最终使用了一种略有不同的方法,请参阅下面的答案。如果您将此添加到您的答案中,我可以接受它
  • 干杯!我用您的解决方案更新了答案,该解决方案基本上扩展了第三个选项
猜你喜欢
  • 2018-11-20
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多