36

我有一个在共享主机上运行 IIS 7.5 服务器和 ASP.NET 4.0 的网站,但完全信任。

该站点是一个基本的“文件浏览器”,允许访问者登录并显示可供他们使用的文件列表,并且显然可以下载文件。静态文件(主要是 pdf 文件)位于站点上名为 data 的子文件夹中,例如http ://example.com/data/ ..。

该站点使用 ASP.NET 表单身份验证。

我的问题是:如何让 ASP.NET 引擎处理对数据文件夹中静态文件的请求,以便对文件的请求由 ASP.NET 进行身份验证,并且用户无法深度链接到文件和抓取他们不允许拥有的文件?

4

6 回答 6

50

如果您的应用程序池在集成模式下运行,那么您可以执行以下操作。

将以下内容添加到您的顶级 web.config。

  <system.webServer>
    <modules>
      <add  name="FormsAuthenticationModule"  type="System.Web.Security.FormsAuthenticationModule" />
      <remove  name="UrlAuthorization" />
      <add  name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"  />
      <remove  name="DefaultAuthentication" />
      <add  name="DefaultAuthentication"  type="System.Web.Security.DefaultAuthenticationModule" />
    </modules>
  </system.webServer>

现在,您可以在 web.config 中使用标准 ASP.NET 权限来强制对目录中的所有文件进行表单身份验证。

<system.web>
    <authorization>
        <deny users="?" />
    </authorization>
    <authentication mode="Forms" />
</system.web>
于 2010-05-25T13:22:47.550 回答
13

我在让角色进行身份验证时遇到了同样的问题。通过反复试验,我终于可以对@Joel Cunningham 的代码进行小幅编辑:

<modules runAllManagedModulesForAllRequests="true" >

我使用这两个站点作为参考:http ://forums.iis.net/t/1177964.aspx和http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-该-iis-集成管道/

于 2012-05-01T01:52:11.083 回答
10

这是一个旧线程,但我碰巧遇到了与 Egil 相同的问题。这是包含角色的 Joel 修复版本:

<modules runAllManagedModulesForAllRequests="false">
      <remove name="FormsAuthenticationModule" />
      <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
      <remove name="UrlAuthorization" />
      <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"  />
      <remove name="RoleManager" />
      <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
      <remove name="DefaultAuthentication" />
      <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
</modules>
于 2014-05-19T15:33:48.153 回答
9

附录:

正如@eych 所指出的,接受的答案也阻止了对~/Content文件夹(或任何你有 CSS 的地方)的访问,~/Scripts等等。

如果你想允许例外——即允许未经身份验证的用户访问某些文件/文件夹——你可以通过location元素来做到这一点。将以下内容添加到web.config

  <location path="Content">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

更新: 另一种解决方案是默认情况下保持访问权限 - 这将允许访问您的 CSS / JavaScript / 等 - 并将“锁定”(仅)应用于存储静态内容的文件夹:

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

警告:在我们的例子(一个 MVC 站点)中,我们需要用[AuthorizeAttribute]. 无论如何这是一个好主意,但以前没有必要(因为以前任何未经授权的请求都被重定向到登录页面)。

于 2014-07-11T20:32:41.193 回答
8

我想知道为什么需要重新添加默认为集成管道添加的模块(使用默认选项),所以我挖得更深一些。

您需要删除并重新添加模块,因为默认情况下,不会使用默认选项添加模块。它们为向后兼容添加了一个前提条件,以便仅对已注册的 ASP.NET 处理程序(例如,.aspx 页面)处理的内容运行。

默认如下所示:

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" 
         preCondition="managedHandler" />

通过删除模块并在没有先决条件的情况下重新添加它们,这些单独的模块会针对每个请求(包括您的静态内容)运行。它比使能更细化runAllManagedModulesForAllRequests

您可以在 IIS 7 引入集成管道时的几篇文章中了解它:

请注意,第二篇文章(和@John 的答案)中的模块名称有错字或在某个时候从 更改FormsAuthenticationModule为。FormsAuthentication

IIS 7.5 到 8.5 中的一组工作模块对我来说如下所示:

<system.webServer>
  <modules>
    <!-- Re-add auth modules (in their original order) to run for all static and dynamic requests -->
    <remove name="FormsAuthentication" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
    <remove name="DefaultAuthentication" />
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
    <remove name="RoleManager" />
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
    <remove name="UrlAuthorization" />
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
  </modules>
</system.webServer>
于 2015-05-12T19:46:49.553 回答
2

如果您的应用程序池在经典模式下运行,您可以执行以下操作。您必须为您想要处理的每个文件扩展名重复这些步骤,但我在.html这里使用。

首先,将页面构建提供程序添加到 Web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web> 
    <compilation>
      <buildProviders>
        <add type="System.Web.Compilation.PageBuildProvider" extension=".html"/>
      </buildProviders>
    </compilation>
  </system.web> 
</configuration>

然后添加一个页面处理程序工厂:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web> 
    <httpHandlers>
      <add type="System.Web.UI.PageHandlerFactory" path="*.html" verb="*"/>
    </httpHandlers>
  </system.web> 
</configuration>

然后添加一个页面处理程序:

<?xml version="1.0" encoding="UTF-8"?>
<configuration> 
  <system.webServer>
    <handlers>
      <add scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" path="*.html" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" name="HtmlHandler-Classic-32" />
      <add scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" path="*.html" verb="GET,HEAD,POST,DEBUG" name="HtmlHandler-Classic-64"/>
    </handlers>
  </system.webServer>
</configuration>

这对我有用。(信用:http ://www.ifinity.com.au/Blog/EntryId/66/How-To-301-Redirect-htm-or-html-pages-to-DotNetNuke-aspx-pages 。)

于 2016-02-03T02:37:08.873 回答