以本地系统身份而不是当前用户身份读取本地文件

3
我有一个在IIS上运行的ASP.NET C#应用程序。
某些操作需要我使用 `Directory.EnumerateFiles` 读取放置在本地系统上的文件。当我调用该函数时,它可以工作,因为我的Windows用户可以访问那些文件,但是当另一个用户调用相同的页面时,它就无法工作了。
我使用 `WindowsIdentity.GetCurrent().Name` 进行了检查,并且确实看到当前用户是 `CompanyName\MyName`。这些文件包含敏感数据,我不希望将读取权限赋予所有用户,即使它们位于远程系统上。
在我看来,我想要特别授予我的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



1
所以你想始终使用“ApplicationPoolIdentity”读取文件,是吗? - HariHaran
这些文件是否在 Web 服务器的本地文件系统上?如果是,您可以授予 IIS_IUSRS 帐户读取访问权限。 - Andrew Morton
@HariHaran 是的,这是正确的。 - Daniël Camps
@AndrewMorton,它们确实是本地文件,我可以尝试这个。 - Daniël Camps
@AndrewMorton,我刚刚测试了一下,但不幸的是它没有起作用。谢谢你的帮助。 - Daniël Camps
@DaniëlCamps 你可以使用Process Monitor来检查尝试访问文件系统的身份。 - Andrew Morton
1个回答

2
您需要使用某种模拟身份的方式。您可以在此处找到选项: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" />

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

如果您想选择第三个选项,请查看这里的答案,该答案使用以下内容来按代码块模拟:

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

1
这似乎是正确的做法。我已经为你的答案点赞并会尝试它,如果它有效,我会接受它。谢谢Athanasios。 - Daniël Camps
我最终使用了稍微不同的方法,请查看下面的答案。如果你将其添加到你的回答中,我可以接受它。 - Daniël Camps
谢谢!我已经更新了答案,加入了你的解决方案,基本上是在第三个选项上进行扩展。 - Athanasios Kataras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接