我有一个相当严格的自定义身份验证HttpModule
。但是我希望它只针对托管请求运行(而不是针对静态请求)。
Asp.net MVC自动为IIS7 Web服务器添加配置部分:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="ScriptModule" />
<remove name="UrlRoutingModule" />
<add name="ScriptModule"
preCondition="managedHandler"
type="System.Web.Handlers.ScriptModule,..." />
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule,..." />
</modules>
<handlers>
...
</handlers>
</system.webServer>
当我添加自己的模块时,我也设置了preCondition="managedHandler"
,但由于父runAllManagedModulesForAllRequests="true"
元素上有<module>
,我的preCondition
被设计忽略(正如我读到的那样) MSDN)。
当我尝试设置时:
<modules runAllManagedModulesForAllRequests="false">
我收到错误。
我需要在web.config
中设置其他(其他模块)以使此设置有效:
<modules runAllManagedModulesForAllRequests="false">
答案 0 :(得分:3)
我认为您收到了错误消息,因为您的应用程序依赖于其他托管模块(Session),并且该模块配置为仅针对托管处理程序的请求运行(runAllManagedModulesForAllRequests =“false”)。
您可以尝试以下设置重新配置会话模块以针对所有请求运行
<modules>
<remove name="Session" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="" />
</modules>
答案 1 :(得分:2)
确定。所以我有一个解决方案,为此解决方法。 我仍然必须使用默认模块设置为:
<modules runAllManagedModulesForAllRequests="true">
但我可以通过为某些位置设置其他web.config条目来禁用我的自定义身份验证模块,如:
<location path="~/App_Themes">
<system.web>
<authentication mode="None" />
</system.web>
</location>
<location path="~/Content">
<system.web>
<authentication mode="None" />
</system.web>
</location>
<location path="~/Scripts">
<system.web>
<authentication mode="None" />
</system.web>
</location>
所以我在某些路径上禁用了身份验证。这是一种解决方法,而不是一个实际的解决方案。因此,您仍然可以提供自己的建议,甚至是实际解决runAllManagedModulesForAllRequests="true"
默认Asp.net MVC配置的解决方案。