当我在IIS7.5中向ASP.NET MVC2站点添加FormsAuthentication时,我收到HTTP 403.14错误

时间:2010-09-30 13:26:57

标签: asp.net-mvc-2 forms-authentication url-routing iis-7.5

我编写了自定义表单身份验证模块,当我将其添加到我的MVC2应用程序的web.config并在IIS7.5下运行时,我收到HTTP 403.14错误。如果我尝试导航到任何路由的Url,那么我只会得到404错误。令人讨厌的是,我使用Cassini进行了所有测试,没有任何问题。我已经应用了所有类似问题的所有修复无济于事。问题似乎是我的模块已注册Mvc Routing停止工作。显然它似乎暗示我的模块,但为什么它一直使用内置的网络服务器?这是我的web.config的System.x部分:

  <system.web>
    <compilation debug="true" defaultLanguage="c#" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
                <add assembly="Ewdev.Gatekeeper.Security, Version=1.0.0.0, Culture=neutral, PublicKeyToken=02ca582b160d0e09" />
            </assemblies>
    </compilation>
    <authentication mode="Forms">
      <forms defaultUrl="/" loginUrl="/Authentication/Login" enableCrossAppRedirects="true" name=".GKAUTH" path="/" requireSSL="false" timeout="1440" />
    </authentication>
        <membership defaultProvider="GatekeeperMembershipProvider" userIsOnlineTimeWindow="120">
      <providers>
        <clear />
        <add name="GatekeeperMembershipProvider" type="Ewdev.Security.MembershipProviders.GatekeeperMembershipProvider, Ewdev.Gatekeeper.Security, Version=1.0.0.0, Culture=neutral, PublicKeyToken=02ca582b160d0e09" connectionStringName="Ewdev Database" minRequiredPasswordLength="7" minRequiredAlphabeticCharacters="3" minRequiredAlphabeticCaseChanges="1" minRequiredNumericCharacters="1" minRequiredNonAlphanumericCharacters="0" passwordWordsPolicy="true" passwordHistoryPolicy="13" enablePasswordRetrieval="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="true" minRequiredUserNameLength="6" minRequiredUserNameAlphabeticCharacters="1" minRequiredUserNameNumericCharacters="0" userNameEnableNonAlphanumeric="true" userNameWordsPolicy="true" />
      </providers>
    </membership>
    <customErrors mode="On" />
    <pages>
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Linq" />
        <add namespace="System.Collections.Generic" />
      </namespaces>
    </pages>
        <trace enabled="false" mostRecent="true" />
  </system.web>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="true" />
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="FormsAuthentication" />
            <add name="FormsAuthentication" type="Ewdev.Security.GatekeeperFormsAuthenticationModule" preCondition="" />
        </modules>
        <handlers>
            <remove name="MvcHttpHandler" />
            <add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler" />
            <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </handlers>
    </system.webServer>

这一切都在我的Windows 7 x64桌面上运行,包括VS2010,.NET 4和Mvc2。我在IIS中安装/注册了ASP.NET4。我怀疑你可能想知道模块中的内容但是源很长,所以我不知道哪个位是相关的。它是根据与内置API规范相同的API规范构建的,但除了在需要时重定向到Login页面,请求Url没有其他更改,并且在尝试显示对所有人开放的主页时出现错误。我已经读过它可能与非aspx资源有关,例如脚本,css,图像文件,因为模块被设置为应用于所有资源类型?在Url路由模块之后调用我的模块的其他想法,但我不相信那个,第三个可能没有调用Global.asax?我在第3天在这个上撕开我的头发,主要是因为我估计1小时将网站安装到IIS上...... Doh!

非常感谢我能得到的任何帮助,并且非常乐意重写我的模块,只要我能解决IIS不喜欢的问题。卡西尼喜欢它: - (

3 个答案:

答案 0 :(得分:3)

我终于有了解决方案!但这是极端模糊的,并且花了我一周的时间来猜测。

我确信这个问题与路由有关,很多人都说你需要添加 HTTP重定向特殊角色。我已经添加了 HTTP错误静态内容压缩。最终的解决方案是重新安装这3个角色!这表明在IIS世界中安装东西的顺序非常重要,因为我在安装MVC2之前已经设置了IIS7.5(通过VS2010安装),尽管我已经多次完成了其他修复(aspnet_regiis -i for ASP.NET 4.0 x86和x64)这还没有解决路由问题。如果我先安装VS2010(包含MVC2)然后安装IIS7.5我怀疑我不会遇到问题。除此之外,不管你信不信,完全重新安装IIS7.5确实修复了问题,就像我几天前已经尝试过的那样。因此,为了回顾并包含任何其他必要的配置,以下是重要的修复:

  1. 确保您已运行aspnet_regiis -i 对于Framework / v4 ......和 Framework64 / V4 ...

  2. 确保您已允许ASP.NET v4 对于IIS中的32位和64位 (通过IIS管理器,单击 树中的服务器条目然后转到 ISAPI和CGI限制)

  3. 确保您有 HTTP错误 HTTP 重定向常见的HTTP IIS特殊 角色和静态内容压缩 性能IIS特殊角色 安装。如果你拥有那么 卸载并重新安装,这是 什么最终解决了这个问题 我

  4. 请注意: IIS7 的情况也是如此,因为我必须在生产 Windows 2008服务器上执行完全相同的过程。我希望这有助于其他人快速解决问题。由于这个问题,我现在可能会失去合同,因为我已经落后了。

    我原来的web.config在其中有几个不必要的条目,因为我正在尝试人们想出的任何和所有解决方案,所以以下是我当前和工作的System.x部分的web.config

      <system.web>
        <compilation debug="true" defaultLanguage="c#" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
            <add assembly="Ewdev.Gatekeeper.Security, Version=1.0.0.0, Culture=neutral, PublicKeyToken=02ca582b160d0e09" />
          </assemblies>
        </compilation>
        <authentication mode="Forms">
          <forms defaultUrl="/" loginUrl="/Authentication/Login" enableCrossAppRedirects="true" name=".GKAUTH" path="/" requireSSL="false" timeout="1440" />
        </authentication>
        <membership defaultProvider="GatekeeperMembershipProvider" userIsOnlineTimeWindow="120">
          <providers>
            <clear />
            <add name="GatekeeperMembershipProvider" type="Ewdev.Security.MembershipProviders.GatekeeperMembershipProvider, Ewdev.Gatekeeper.Security, Version=1.0.0.0, Culture=neutral, PublicKeyToken=02ca582b160d0e09" connectionStringName="Ewdev Database" minRequiredPasswordLength="7" minRequiredAlphabeticCharacters="3" minRequiredAlphabeticCaseChanges="1" minRequiredNumericCharacters="1" minRequiredNonAlphanumericCharacters="0" passwordWordsPolicy="true" passwordHistoryPolicy="13" enablePasswordRetrieval="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="true" minRequiredUserNameLength="6" minRequiredUserNameAlphabeticCharacters="1" minRequiredUserNameNumericCharacters="0" userNameEnableNonAlphanumeric="true" userNameWordsPolicy="true" />
          </providers>
        </membership>
        <customErrors mode="On" />
        <pages>
          <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
            <add namespace="System.Linq" />
            <add namespace="System.Collections.Generic" />
          </namespaces>
        </pages>
        <trace enabled="false" mostRecent="true" />
      </system.web>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="true" />
        <modules runAllManagedModulesForAllRequests="true">
          <remove name="FormsAuthentication" />
          <add name="FormsAuthentication" type="Ewdev.Security.GatekeeperFormsAuthenticationModule" />
        </modules>
      </system.webServer>
    

答案 1 :(得分:1)

我无法在用户自己的答案中添加评论(评分太低?)。无论如何,在与我的服务器战斗了很长时间后试图解决403.14消息我偶然发现了这个问题。答案中的步骤最终为我解决了问题。

我猜测有效的部分是角色的安装,因为我已经尝试过在这里和其他地方建议的所有其他内容。

非常感谢用户和stackoverflow:)

答案 2 :(得分:0)

我的猜测是你错误地设置了你的MvcHttpHandler。 path属性应为*而不是* .mvc