如何允许仅在App_Data asp.net mvc中下载访问特定文件夹

时间:2014-02-10 21:18:10

标签: c# asp.net asp.net-mvc azure

我在web.config中有这个:

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

我想我会以错误的方式解决这个问题,但我似乎无法找到正确的方法来谷歌这一点。我想只授予该文件夹'UserFiles'的下载权限。我需要通过web.config这样做,因为实时环境将在Azure上,所以我不会有一台机器到RDP来改变这是IIS。

2 个答案:

答案 0 :(得分:9)

首先,如果您使用的是Azure Web角色而不是Azure网站,那么您应该将这些内容存储在blob中。其次,这些文件是否需要保护,以便只有经过身份验证的用户才能访问它们(甚至用户只能访问自己的文件?)。

让我们假设任何人都可以从服务器下载任何文件。如果是这种情况,请在内容下创建一个名为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控制器,让我们调用它,你实际上将用它来将文件传递给用户。在这里,让我们做一个名为download的动作,它接受一个文件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文件夹,而外部Web用户则不会。使用控制器/操作来控制内容

答案 1 :(得分:5)

App_Data 中的文件无法按照设计提供给最终用户

App_Data用于存储数据文件。来自MSDN

  

App_Data包含应用程序数据文件,包括.mdf数据库文件,XML   文件和其他数据存储文件。 App_Data文件夹由。使用   ASP.NET用于存储应用程序的本地数据库。

     

应用程序文件夹的内容... 未提供   响应Web请求,但可以从应用程序代码访问它。

如果人们可以从App_Data中下载数据库等内容,那将是非常糟糕的。

您需要将UserFiles文件夹移到App_Data之外。