如何允许在ASP.NET MVC中仅对App_Data特定文件夹进行下载访问

5

我在我的web.config文件中有以下配置:

<system.webServer>
    <security>
      <requestFiltering>
        <hiddenSegments>
          <add segment="UserFiles"/>
        </hiddenSegments>
      </requestFiltering>
    </security>
</system.webServer>

我觉得我的方法可能不对,但是我找不到正确的谷歌搜索方式。我想授权仅限于文件夹“UserFiles”的下载访问权限。由于实际环境将在Azure上运行,因此我需要通过web.config来完成这个任务,因为我无法使用远程桌面连接到IIS上更改它。

2个回答

9

首先,如果您使用的是 Azure Web 角色而不是 Azure 网站,则应将这些内容存储在 Blob 中。其次,这些文件是否需要安全保护,以便仅经过身份验证的用户可以访问它们(或仅用户可以访问自己的文件?)。

让我们假设任何人都可以从服务器下载任何文件。如果是这种情况,请在 content 下创建名为 UserFiles 的目录。现在,您只需像这样链接到这些文件:

<a href="@Url.Content("~\Content\UserFiles\filename.ext")">MY File title</a>

现在,如果它们被一个认证方案所保护,情况就变得棘手了。你不希望任何人都能下载这些项目。因此,让我们采取一些步骤来保护它们。

1.在你的解决方案顶层创建一个名为UserFiles的文件夹。

2.在你的web.config中,让它不能被任何人访问。

 <system.webServer>
<security>
  <requestFiltering>
    <hiddenSegments>
      <add segment="UserFiles"/>
    </hiddenSegments>
  </requestFiltering>
</security>

3.创建一个MVC控制器,我们称之为“文件”,你实际上将使用它来向用户传递文件。在这里,让我们创建一个名为“下载”的操作,它接受一个文件ID(假设你正在数据库中存储文件信息)。

public FileResult Download(int id){
   //perform logic to see if user has access to this file
   //if access, return the file
   //else return a 404
}

现在,您的文件下载链接将如下所示:
@Html.ActionLink("My File Title", "Download", "Files", new{id = Model.Id})

MVC和您的代码将能够访问UserData文件夹,而外部网络用户则不能。使用控制器/操作来保护您的内容。


是的,我不使用Azure角色,否则我会使用Blob存储。感谢您的回答。看起来我需要进行一些重构,但这很有道理! - ledgeJumper

5
App_Data文件夹中的文件是根据设计不会向最终用户提供服务。 App_Data 用于存储数据文件。根据MSDN:App_Data 包含应用程序数据文件,包括 .mdf 数据库文件、XML 文件和其他数据存储文件。ASP.NET 使用 App_Data 文件夹来存储应用程序的本地数据库。应用程序文件夹的内容不会响应 Web 请求,但可以从应用程序代码访问。如果人们可以从 App_Data 下载诸如数据库之类的东西,那将非常糟糕。您需要将UserFiles文件夹移动到App_Data之外。

哎呀,这真是个烦恼。因为使用Msdeploy进行部署时,最安全的方式是允许其删除不属于部署范围内的文件。在这种情况下,唯一安全的数据存储位置是app_data文件夹,因为可以告诉msdeploy不要去操作它。但如果用户无法直接从该文件夹下载,则我无法在网站上保留用户可以获取且不会被msdeploy删除的数据。 - Paul Spain

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