ASP/ASP.NET 处理写权限的最佳方式?

Mat*_*ino 4 iis permissions asp.net asp

假设您在 IIS 上有一个公共 ASP.NET(或经典 ASP)应用程序,其脚本/页面需要在位于 Web 发布文件夹树内的特定文件夹中写入或更新文件。

1)设置它的正确方法是什么?

我主要关心的是我想让 ASP/ASP.NET 应用程序写入文件夹,但我不希望普通的 http 用户能够将文件放入其中。

Dom*_*c D 5

首先让我开始说,我非常相信几乎总是有比将内容写入磁盘更好的解决方案。无论是将数据写入数据库,还是提供 Web 服务,写入磁盘都应该是最后的选择。
话虽如此,但有一些正当理由,但这有点棘手,并且取决于应用程序需要写出文件的原因。

在代码运行位置之外写入数据是绝对要求。出于显而易见的原因,允许最终用户写入 ASPX/asp 引擎可以解释/执行代码的路径是不好的。

影响这一点的其他一些事情是:

  1. 无论您是在域帐户下还是在标准网络服务下运行工作进程。重要的是要认识到,当您授予 IIS_WPG 组对文件夹的写访问权限时,在服务器上的默认帐户下运行的任何 ASP.NET 应用程序都可能将文件写入该文件夹。在运行多个应用程序的服务器上,这是一种不太理想的配置,尤其是当应用程序不受信任和/或在 ISP/共享托管环境中运行时。
  2. 生成的文件是否需要在网络上可用。如果您的应用程序只是写出一些非 Web 可见的文件,只需创建目录、授予权限并将应用程序配置为读取/写入正确的位置即可。如果应用程序需要写出 Web 可查看文件(这在内容管理方案中很常见),您需要创建一个映射到可写目录的虚拟目录(没有执行代码/脚本权限)。
  3. 无论您是否在负载平衡/网络场环境中工作。如果您的应用程序在农场环境中运行并且由于某种原因需要将文件写入磁盘,那么您将面临一个全新的问题。您如何使 webserver1 上的用户生成文件与 webserver2 上生成的文件保持同步?通过一些复杂的同步脚本来完成它充其量是痛苦的,并且充斥着种族/同步问题。实现这一点的最佳方法是在第三台服务器(最好是具有一些冗余的集群)上创建共享并将数据存储在那里。如果您在域帐户下运行您的工作进程(安全最佳实践),您甚至可以映射到应用程序中的共享,而无需在代码或 web.config 的任何位置使用用户/密码(让审计/安全人员高兴)。