File.Exists()错误地从ASP.NET返回false - 与Thread vs Process身份相关的安全问题?

时间:2009-10-05 11:46:21

标签: asp.net security permissions impersonation

我有一个使用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 \ Webservers组的成员,后者又可以完全控制共享文件。

这是我不明白的地方:

  1. 当.NET尝试查询File.Exists时,是否正在使用线程进程标识?
  2. 如果它正在使用流程凭据 - 我如何强制进程以MYDOMAIN \ my.username运行,或者授予NETWORK SERVICE帐户读取文件的权限? (我认为这已经通过添加我的计算机帐户来完成 - 但它不起作用......)
  3. 如果它正在使用线程的凭据 - 为什么我不能读取文件?
  4. 非常感谢任何指针或有用的调试技巧。

    谢谢,

    迪伦

1 个答案:

答案 0 :(得分:2)

在这些情况下,我总是启动Sysinternals进程监视器并过滤掉有问题的文件。 从那里,您可以看到实际访问该文件的帐户。

通常,如果您没有模拟,则将使用运行应用程序池的帐户。 您的应用程序池帐户是什么?

关于问题2: 您可以通过在资源管理器中右键单击文件和所选权限来设置文件的正确权限。从那里,您可以添加网络服务帐户并授予其读取权限。

你在运行什么操作系统? 根据操作系统的不同,默认的应用程序池帐户是Network Service或AppPoolIdentity,因此请确保选择正确的帐户。