我的 ASP 页面从共享目录读取文件并将其发送给用户。
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition:", string.Format("attachment; filename={0}", fileName));
Response.WriteFile(filePath);
Response.End();
该 ASP 代码在 Web 服务器上运行,我认为它以本地系统帐户运行,因为 IIS 是这样的。filePath 指向文件服务器上的文件 \\fileserver\shared\abc.pdf
当我在本地计算机上调试代码时,文件可以从 ASP 页面正确读取。但是当我在 Web 服务器上运行它时,它无法读取文件。我需要授予 \fileserver\shared 什么权限,以便 ASP 页面可以正确读取文件?显然,本地系统不是权限页面中的有效用户登录名。
答案1
ASP.NET 工作进程使用 IIS 中配置的应用程序池标识运行。在 IIS 6 及更高版本中,默认为网络服务(正如 splattne 指出的那样)。
如果您需要从 ASP.NET 应用程序访问远程文件,我建议创建一个特定的域帐户并以该用户身份运行应用程序池,并授予该用户对共享的访问权限。这样您就可以控制谁可以访问这些文件。网络服务是所有 WinXP 计算机(及更高版本)上都存在的内置帐户,因此您不会希望将共享开放给该帐户。
另一个解决方案是仅提升访问共享的代码以使用域登录,但让其余的 ASP.NET 代码作为网络服务运行。这可能更安全,但您必须弄清楚如何安全地存储凭据。
—戴夫
答案2
网络服务和本地系统都以计算机帐户 (DOMAIN\computer$) 的形式出现在网络上。因此,如果您无法使用常规用户帐户,则需要授予该帐户对文件共享的权限。
答案3
在 Windows Server 2003 (IIS 6.0) 中,ASP.NET 代码运行为
Network Service
帐户。因此,授予该内置帐户该文件夹的读取权限。
Microsoft TechNet 文章:IIS 和内置帐户 (IIS 6.0)
内置网络服务用户帐户在系统上的访问权限比本地系统用户帐户少,但网络服务用户帐户仍然能够使用计算机帐户的凭据在整个网络中进行交互。
对于 IIS 6.0,建议为应用程序池定义的工作进程标识以网络服务用户帐户运行,这是默认设置。下表显示了网络服务帐户的默认用户权限,以及每个权限的派生方式。