ASP.NET MVC 5 Identity&保护文件夹

时间:2014-10-23 09:01:38

标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity

好吧,我不知所措。我到处寻找,但我仍然遇到错误。我有一个文件夹,里面有几个pdf文件。该文件夹名为" docs"它位于我项目的根目录中。我使用以下代码将web.config文件放在该文件夹中...

<system.web>
    <authorization>
        <deny users="?" />
    </authorization>
</system.web>

我还尝试使用以下代码将代码放在我的根web.config文件中......

<location path="/docs">    
    <system.web>
        <authorization>
            <deny users="?" />
        </authorization>
    </system.web>
</location>

这两个代码块都会产生500服务器错误。不幸的是,由于我在共享托管上,我无法访问详细的服务器错误。有什么想法吗?

修改:抱歉......这是我在凌晨1点发布问题所得到的。我想保护文件夹,以便只有登录和授权的用户才能访问它并下载文件。

3 个答案:

答案 0 :(得分:3)

我遇到了类似的问题(see here)。解决方案是将web.config添加到目录中,还要向其添加处理程序指令。这对我有用。

<?xml version="1.0"?>
<configuration>
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  <system.webServer>
    <handlers>
      <add name="PDFHandler" verb="*"
        path="*.pdf"
        type="System.Web.StaticFileHandler"
        resourceType="Unspecified" />
    </handlers>
  </system.webServer>
</configuration>

答案 1 :(得分:1)

  

我想保护文件夹,以便只记录那些用户   in和authorized可以访问它并下载文件。

如果您只想将下载限制为已登录和已通过身份验证的用户,则GlenBee’s solution是迄今为止最简单,最有效的用户。

如果您需要按角色和/或声明限制访问权限,则有两种选择:

  1. 如果您对隐匿性的安全性感到满意,则可以控制对包含文件链接的页面的访问。这些文件存储在wwwroot中,因此您需要做的就是在执行角色/声明过滤的页面上链接到它们。缺点是任何人都可以猜测文件路径和名称,并在没有正确角色/声明的情况下获得对它们的访问权限(尽管根据GlenBee的解决方案,您仍然应该仅为经过身份验证的用户保护文件目录)。
  2. 如果您需要确保无例外,除了那些因其角色/声明(或其他一些要求,例如直接授权)授权的人员外,任何人都无法访问这些文件所有权),您不仅要保护带有链接的页面(过滤角色/声明/所有权),还要创建一个文件处理程序,将文件传递给要下载的用户(文件流等),以及将文件本身存储在wwwroot之外,以便无法通过普通HTTP访问它们。这个“文件切换脚本”确保传递文件的用户实际上具有所需的角色/声明/所有权,而不是仅仅能够盲目地猜测文件的路径;并将文件存储在wwwroot之外,确保只有脚本才能获取文件。

答案 2 :(得分:0)

我正在做同样的事情,这是我放在文件夹中的web.config的内容:

<configuration>
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>  
</configuration>

错误:

我做的一个简单的解决方案是启用运行状况监控并让它向我发送错误,这是在我的根web.config中:

<system.web>
  <healthMonitoring enabled="true">
      <eventMappings>
        <clear/>
        <!-- Log ALL error events -->
        <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
        <!-- Log application startup/shutdown events -->
        <!--<add name="Application Events" type="System.Web.Management.WebApplicationLifetimeEvent" startEventCode="0" endEventCode="2147483647"/>-->
      </eventMappings>
      <providers>
        <clear/>
        <!-- Provide any customized SqlWebEventProvider information here (such as a different connection string name value -->
        <add name="SqlWebEventProvider" connectionStringName="ConnectionString" maxEventDetailsLength="1073741823" buffer="false" type="System.Web.Management.SqlWebEventProvider"/>
        <add name="EmailWebEventProvider" buffer="false" type="System.Web.Management.SimpleMailWebEventProvider" from="website@example.com" to="webmaster@example.com" subjectPrefix="Website Error: "/>
      </providers>
      <rules>
        <clear/>
        <add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00"/>
        <!--<add name="Application Events Default" eventName="Application Events" provider="SqlWebEventProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00"/>-->
        <add name="All Errors To E-Mail" eventName="All Errors" provider="EmailWebEventProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00"/>
      </rules>
    </healthMonitoring>
</system.web>

<system.net>
    <mailSettings>
      <smtp from="no_reply@example.com">
        <network host="mail.example.com" userName="website@example.com" password="P@$$w0rd"/>
      </smtp>
    </mailSettings>
  </system.net>