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

led*_*per 5 c# asp.net asp.net-mvc azure

我在web.config中有这个:

<system.webServer>
    <security>
      <requestFiltering>
        <hiddenSegments>
          <add segment="UserFiles"/>
        </hiddenSegments>
      </requestFiltering>
    </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*mmy 9

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

让我们假设任何人都可以从服务器下载任何文件.如果是这种情况,请在内容下创建一个名为UserFiles的目录.现在,您可以直接链接到这些文件

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

现在,如果他们在身份验证方案背后受到保护,事情会变得棘手.您不希望任何人都能够下载这些项目.因此,我们采取一些措施来保护它们.

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

2.在你的web.config中,让它进入无人可以访问它的地方

 <system.webServer>
<security>
  <requestFiltering>
    <hiddenSegments>
      <add segment="UserFiles"/>
    </hiddenSegments>
  </requestFiltering>
</security>
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

现在,您的文件下载链接将如下所示

@Html.ActionLink("My File Title", "Download", "Files", new{id = Model.Id})
Run Code Online (Sandbox Code Playgroud)

MVC和您的代码将可以访问UserData文件夹,而外部Web用户则不会.使用控制器/操作来控制您的内容


Mik*_*Dev 5

根据设计,文件App_Data 不会提供给最终用户.

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

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

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

如果人们可以从App_Data下载像数据库这样的东西,那将是非常糟糕的.

你需要在移动UserFiles文件夹之外App_Data.