IIS7不会将授权传播到子目录

我们的应用程序正在使用表单authentication,解决scheme一直运行良好。

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

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

这会导致redirect到未经身份validation的用户(非常标准)的login页面。

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

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

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

问题在于服务器对样式表的请求正被redirect到login页面。

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

我知道configuration是正确的,因为我可以采取相同的应用程序,并放在一个新的Server 2008安装,它的工作原理。

任何想法如何我可以解决这个问题,而不重build整个机器?

这个问题最终是由于托pipe文件所在的目录不能被IUSR帐户访问(尽pipe“NETWORK SERVICE”和应用程序池标识是可以访问的)。 当我正在testing新的IIS7安装时,我将目录树复制到IUSR已经有权访问的\ inetpub \ wwwroot中。

它仍然不清楚为什么这个问题performance为redirect到login页面(好像它没有正确地传播授权设置),但是我确实发现了一些表单身份validation的configuration问题。

这部分是关键的,因为我发现的一切都不正确(或充分)解释这一点。

几乎在任何地方我search我find了web.config的以下设置。

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

通常解释的方式是将这些未经身份validation的用户redirect到login.aspx,并且授权用户被授予访问权限。

实际上,这个configuration部分只适用于ASP.NET页面(aspx)。 任何其他types的内容(html,asp,jpg等)都不受此configuration的约束。

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

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

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

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

有关于以下论坛线程的讨论,可能会对您有所帮助: web.configinheritance问题和<authorization>部分 。

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

包含在应用程序级configuration文件中的规则优先于inheritance的规则。 系统通过构buildURL的所有规则的合并列表来确定哪个规则优先,最近的规则(层次结构中最近的规则)位于列表的头部。