File.Exists()错误地返回false从ASP.NET - 主题VS进程标识相关的安全问题

2019-10-17 18:36发布

我使用的是Windows身份验证的ASP.NET应用程序,而我在远程服务器上测试一个文件是否存在。

我作为认证MYDOMAIN \ my.username - 这工作。

该文件是\ MYSERVER \ Webshare的\ example.txt中。 该文件存在。 而登录为MYDOMAIN \ my.username我可以从不同的主机打开它。 在Windows资源管理器,有效权限表明,MYDOMAIN \ my.username有此文件的完全控制。

如果我附加一个调试器和类型$user在监视窗口中,我可以看到,当前线程正在作为MYDOMAIN \ my.username,而当前进程仍与运行NT AUTHORITY\NETWORK SERVICE -手表的相关位窗口转载如下:

$user  {...}  $user register
 +- Process  {...}  TOKEN
 |  +- Name                 NT AUTHORITY\NETWORK SERVICE  User Name
 |  +- User                 SID  S-1-5-20                 SID
 |  +- Session Id           0                             DWORD
 |  +- Loggin Id            000003e4-00000000             LUID
 |  +- Impersonation Level  N/A (not impersonating)       SECURITY_IMPERSONATION_LEVEL
 +- Thread  {...}  TOKEN
    +- Name                 MYDOMAIN\my.username          User Name
    +- User SID             S-1-5-21-...                  SID
    +- Session Id           0                             DWORD
    +- Loggin Id            018622ef-00000000             LUID
    +- Impersonation Level  Impersonate                   SECURITY_IMPERSONATION_LEVEL

是的运行ASP.NET的服务器是MYDOMAIN \ Web服务器组,这反过来又对共享文件的完全控制权的成员。

这就是我不明白:

  1. 当.NET尝试查询File.Exists,是它正在使用的线程进程的身份?
  2. 如果它在使用过程中的凭据-怎样才能既强制进程作为MYDOMAIN \ my.username运行,或给网络服务帐户的权限读取文件? (我认为这已经加入我的计算机帐户做 - 但它不工作...)
  3. 如果是使用线程的凭据 - 为什么我不能读取文件?

任何指针或有用的调试技巧将是非常感激地接受。

谢谢,

迪伦

Answer 1:

在这种情况下我总是火起来的Sysinternals的Process Monitor,并筛选出有问题的文件。 从那里,你可以看到什么解释实际上是在存取文件。

在一般情况下,如果你不模仿,将被用于运行应用程序池的帐户。 什么是您的应用程序池帐户?

关于问题2:您可以通过在资源管理器中右击它并选择权限的文件设置正确的权限。 从那里,你可以添加网络服务帐户,并给它读取权限。

什么操作系统,你运行? 根据不同的操作系统上,默认的应用程序池帐户或者是网络服务或AppPoolIdentity所以一定要确保你正在检查正确的。



文章来源: File.Exists() incorrectly returning false from ASP.NET - security issue related to Thread vs Process identity?