最奇怪的IIS Windows身份验证行为

时间:2010-06-29 11:41:09

标签: iis windows-authentication

我使用Windows身份验证在企业网络中的Windows Server R2上运行ASP.NET网站。

  • 网站的应用程序池使用的是域帐户,并采用集成管道模式。
  • 身份验证设置为Windows身份验证,所有其他身份验证模式均已禁用。

然而,这不起作用。每次我访问该网站时,都会弹出一个询问用户名和密码的对话框。我输入正确的域用户名和密码,但它不会继续 - 窗口再次弹出。三次后,它会失败并显示一个白页。我试过很多不同的浏览器,但都失败了。我让一些同事尝试,他们都失败了。

我无法弄清楚为什么会发生这种错误,并尝试了很多方法来解决它而没有运气。我觉得这很奇怪。然而,最后我找到了解决这个问题的方法,这是问题最奇怪的部分:我在网站的“基本设置”中编辑“物理路径”,我只是将它指向另一个健康的网站,例如, %SystemDrive%\ inetpub \ wwwroot,然后我尝试浏览网站,非常好,它运行良好并显示默认页面(iisstart.htm)。它看起来不是很有帮助,但后来我改变了物理路径回到我的网站;突然一切顺利 - Windows身份验证工作!我不知道为什么会有所帮助,但我对这个结果感到满意 - 它解决了我的问题,虽然我不知道到底发生了什么。

快乐时间总是很短,几天后,服务器得到了一些补丁并重新启动,网站无法再次运行。而且,我可以使用上面的技巧解决问题。

我不喜欢这个!每次IIS重置或服务器重启时,我都不喜欢做这个愚蠢的技巧。

是否有人对Windows身份验证失败的原因有所了解,以及为什么上述技巧可以修复它,以及为什么在IIS重置后它再次失败?

8 个答案:

答案 0 :(得分:11)

首先,感谢您创建此帖子。我有完全相同的问题,如果没有发布对我无效的明显修复,就找不到其他人。我已经做了近两周的工作了

为了帮助遇到这个问题的下一个可怜的灵魂并发布,我希望我的额外花絮有所帮助。

您的初始解决方案并没有解决我的问题,但它确实证明了它与自定义错误页面相关。将代码粘贴到web.config后,我的问题变得更糟,我无法调试或启动页面(有500个与web.config相关的内部服务器错误)

但最后我做的是进入IIS控制台并删除所有自定义错误页面。它仍然没有像希望的那样工作。但是,我还在站点控制台的上半部分找到了ASP.NET " .NET自定义错误" 的条目(以及"自定义错误"标记为web.config中)。我在那里有旧条目并通过控制台将其删除,而YESSSS,我的网站通过Windows身份验证恢复正常。

我已经重新创建了IIS自定义错误,我仍然按照设计运行。

对于可能存在此问题的任何其他人,请检查ASP.NET自定义错误 AND IIS自定义错误设置。也许有冲突,我不知道,但在我的情况下,只有IIS页面设置固定我(现在:-))

答案 1 :(得分:6)

我刚刚发现它似乎是由“错误页面”下的客户401错误页面引起的。我将其设置为在我的web.config中状态代码为401时执行URL,它看起来像:

 <httpErrors errorMode="Custom">
 <remove statusCode="401" subStatusCode="-1"/>
    <error statusCode="401" path="/Error/AccessDenied" responseMode="ExecuteURL"/>
 </httpErrors>

然后,每次重置IIS并尝试访问此网站时,都会出现问题。如果我在Web.Config中删除它或从IIS控制台删除,那么问题就会消失,更有趣的是另一个实验:删除此设置并成功打开网站后,我添加了此设置。一切都很好。每个域用户都可以访问该网站,那些未通过授权的用户将获得客户错误页面。

所以现在我的解决方案是在Web.Config中删除此设置,每次重置IIS或重新启动服务器时,服务器管理员需要首先访问网站,然后在IIS控制台中添加此客户错误页面。

我觉得这是Windows Server 2008 R2上的II7.5的错误。

答案 2 :(得分:6)

我整天都在努力解决这个问题。我在web.config中使用Windows身份验证和自定义错误设置401错误。 重置IIS后,网站停止接受域用户,并且一次又一次地重新出现Windows身份验证弹出窗口。

我在带有子状态代码的web.config文件中添加了删除标记。

<httpErrors>
          <remove statusCode="401" subStatusCode="-1" />
          <remove statusCode="401" subStatusCode="1" />
            <error statusCode="401" subStatusCode="-1" path="/Custom401.aspx" responseMode="ExecuteURL" />          
            <error statusCode="401" subStatusCode="1" path="/Custom401_1.aspx" responseMode="ExecuteURL" />
        </httpErrors>

以前删除标记仅适用于子状态代码-1但缺少子状态代码“1”。在我添加之后,一切都开始正常了。

在上面的帖子中,错误标记缺少子状态代码,这可能是问题的原因。应该删除所有401错误的标记。

答案 3 :(得分:3)

我花了几个小时挖掘出这个问题的解决方案。

为什么IE失败但其他浏览器成功: IE尝试使用Kerberos身份验证,其他浏览器不尝试。其他人使用NTLM。

解决方案:在问题中描述的情况下,应用程序池中正在使用域帐户。简单的解决方案:切换到使用“网络服务”帐户。更复杂的解决方案:您必须注册服务主体名称(SPN)。阅读本文(忽略它正在讨论IIS 6的事实,因为它在IIS 7和7.5上也能正常工作) - You receive an "HTTP Error 401.1 - Unauthorized: Access is denied due to invalid credentials" error message when you try to access a Web site

我希望这会有所帮助。在我偶然发现那篇文章之前,它让我很头疼。 (感谢Paul Lynch发布链接Windows Authentication Failing in IE8 but not Firefox

答案 4 :(得分:1)

我在Windows 2008 R2服务器上遇到了同样的问题。我没有自定义401错误页面。我确实使用了别名服务器名称(通过IIS绑定上的DNS CNAME记录和主机标头条目)。我按照建议为Kerberos注册了SPN,但这并没有解决问题。我通过禁用“内核模式身份验证”(单击IIS树中的服务器 - &gt;双击IIS组下的身份验证 - &gt;单击Windows身份验证 - &gt;单击“操作”窗格上的“高级设置” - 解决了这个问题&gt;取消选中该复选框 - &gt;点击确定 - >运行iisreset。该对话框中的信息建议不要在为应用程序池标识使用非标准服务帐户时禁用内核模式身份验证,但这不适用于我们,因为我们使用的是标准的ApplicationPoolIdentity标识。

答案 5 :(得分:0)

将“NT Service\trustedInstaller”添加到网站的物理文件夹中。该用户的位置是本地计算机名称。

答案 6 :(得分:0)

用于集成Windows身份验证的NTLM协议需要两个步骤来验证客户端。 &#34;症状&#34;中提到的行为;当满足以下条件时,会出现以下部分:

  • 应用程序池在集成Windows身份验证过程的第一步之后进行回收。
  • 但是,应用程序池在集成Windows身份验证过程的第二步之前进行回收。

要解决此问题并减少这些错误消息的频率,请将应用程序池配置为不太频繁地进行回收。要配置应用程序池回收,请按照下列步骤操作:

  1. 单击“开始”,单击“运行”,键入inetmgr,然后单击“确定”。
  2. 展开要配置应用程序池回收的计算机的名称,然后展开“应用程序池”。
  3. 右键单击要配置的应用程序池,然后单击“属性”。
  4. 在“回收”选项卡上,配置其中一个指标,以便IIS不那么频繁地回收。
  5. 注意IIS 6应用程序池支持多个指标。这些度量标准包括已用时间,请求数以及回收应用程序池的指定时间。如果应用程序池具有导致应用程序池频繁回收的度量标准,则会更频繁地遇到此问题。

    1. 单击“确定”。
    2. [从[{3}}复制后代]

答案 7 :(得分:0)

我有同样的问题.. Turnes out我不应该搞乱我的主机文件..我改变了我的主机文件,并指出了一些奇特的地址,如下所示:

www.givemeyourcredentials.com    127.0.0.1

我在网站“www.givemeyourcredentials.com”中添加了绑定。我输入了地址栏中的地址,网站提示我的凭据符合预期。输入我的凭据并再次提示我的凭据..一次又一次......

结果显示:在IIS网站中使用Windows身份验证时,将您的网站绑定到http://localhost这对我有用。

希望这有助于某人...