3

我有一个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">
4

2 回答 2

3

我认为您收到了错误消息,因为您的应用程序依赖于其他一些托管模块(会话),并且该模块配置为仅针对托管处理程序的请求运行(runAllManagedModulesForAllRequests="false")。

您可以尝试以下设置来重新配置会话模块以针对所有请求运行

<modules>
<remove name="Session" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="" />
</modules>
于 2009-07-22T10:12:03.237 回答
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 配置的解决方案。

于 2009-07-22T10:27:35.453 回答