IIS7 未将授权传播到子目录

IIS7 未将授权传播到子目录

我们的应用程序正在使用表单身份验证,并且该解决方案运行良好。

最近,我们的一台 2008 服务器出现了授权未传播到子目录的问题。换句话说,在主 web.config 中,我们有以下授权设置。

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

这会导致未经身份验证的用户重定向到登录页面(非常标准)。

样式表位于子目录 /Content/Styles 中,并且 Contents 目录有另一个 web.config,它使用以下内容覆盖授权:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <authorization>
            <allow users="?" />
        </authorization>
    </system.web>
</configuration>

这应该允许未经身份验证的用户访问样式表目录(也是非常标准)。

问题是服务器对样式表的请求被重定向到登录页面。

我尝试删除站点和应用程序池并重建它们,还从服务器中删除了 IIS 角色(包括 WAS(Windows 进程激活服务))并重新安装。这些都无法解决问题。

我知道配置是正确的,因为我可以采用相同的应用程序并将其放在新安装的 Server 2008 上并且它可以运行。

有什么想法可以解决此问题而无需重建整个机器吗?

答案1

这个问题的根本原因是 IUSR 帐户无法访问文件所在的目录(尽管“NETWORK SERVICE”和应用程序池标识可以访问该目录)。当我在全新安装的 IIS7 上进行测试时,我将目录树复制到 IUSR 已经具有访问权限的 \inetpub\wwwroot 中。

目前仍不清楚为什么该问题表现为重定向到登录页面(好像它没有正确传播授权设置)但我确实发现表单身份验证配置存在一些问题。

这部分至关重要,因为我发现的所有内容都不能正确(或充分)解释这一点。

几乎在我搜索的所有地方,我都发现了 web.config 的以下设置。

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/login.aspx" />
    </authentication>
    <authorization>
      <deny users="?" />
      <allow users="*" />
    </authorization>
  </system.web>
</configuration>

通常的解释是,未经身份验证的用户被重定向到 login.aspx,而经过身份验证的用户则被授予访问权限。

事实上,该配置部分仅适用于ASP.NET页面(aspx)。任何其他类型的内容(html、asp、jpg 等)均不受此配置的约束。

为了保护这些类型的内容,您必须安装“IIS 7 URL 授权”,并且它需要如下所示的 web.config 部分。

<system.webServer>
  <security>
    <authorization>
      <clear />
      <add accessType="Deny" users="?" />
      <add accessType="Allow" users="*" />
    </authorization>
  </security>
</system.webServer>

我看到一个地方解释了 IIS6 与 IIS7 之间的区别,但这并不完全准确。不同类型的内容有不同的授权机制,如果您想限制对非 aspx 页面的访问,则需要两者。

答案2

我想到的一个想法是,“styles”子文件夹中还有另一个 web.config 文件,其中包含另一条<deny users="?">规则。

以下论坛主题中的讨论可能会引起您的兴趣:web.config 继承和 <authorization> 部分的问题

这篇 MSDN 文章包含一个有趣的句子。我不知道该如何解释它:

应用程序级配置文件中包含的规则优先于继承的规则。系统通过构建 URL 的所有规则的合并列表来确定哪条规则优先,其中最新的规则(层次结构中最接近的规则)位于列表的顶部。

相关内容