将预身份验证标头用于 Internet Explorer 和 IIS 时,将返回意外的 401.1 状态

本文解决了预身份验证标头返回意外的 401.1 状态的问题。 当使用 Internet Explorer 浏览器浏览到 Internet Information Services(IIS)上托管的 Web 应用程序时,会发生此情况。

原始产品版本: Microsoft Edge 中的 Internet Explorer 模式、Internet Explorer 11、Internet Information Services
原始 KB 数: 2749007

现象

假设出现了下面这种情景:

  • 可以使用 Internet Explorer(或 Microsoft Edge 中的 Internet Explorer 模式)浏览 IIS 上托管的 Web 应用程序。
  • 客户端计算机配置为在 Internet 设置中使用预身份验证,并在 IIS 中启用内核模式身份验证。
  • Internet Explorer 发送的 Web 请求(或 Microsoft Edge 中的 Internet Explorer 模式)是发送到 IIS 应用程序的第一个请求。

在此方案中,IIS 可能会返回 HyperText 传输协议 (HTTP) 401.1 响应 Internet Explorer(或 Microsoft Edge 中的 Internet Explorer 模式)以响应浏览器的请求。 Web 浏览器可能会提示输入用户名和密码。 或者,可能会在浏览器窗口中显示 HTTP 401.1 错误消息。

原因

此为有意行为。 如果 Web 浏览器发送到 IIS 应用程序的第一个请求包含以下标头之一,则会发生 401.1 响应:

  • Windows 质询/响应 (NTLM) 标头
  • 协商 WWW-Authorization 标头(称为预身份验证)

备注

用户可能会在 Internet Explorer 中提示输入超出本文作用域的凭据的原因有很多。 请参阅“详细信息”部分,了解如何确定提示原因是否来自此处所述的问题。

解决方法

若要解决此问题,请在 Internet 设置中禁用预身份验证或关闭 IIS Web 应用程序的内核模式身份验证。

警告

如果注册表编辑器不正确,可能会导致严重问题,可能需要重新安装操作系统。 Microsoft无法保证你无法正确解决使用注册表编辑器导致的问题。 请慎用注册表编辑器,风险自负。

若要在 Internet Explorer 中修改此行为,请使用注册表编辑器(Regedt32.exe)将值添加到以下注册表项:

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/

备注

注册表项是一个路径;它已包装为可读性。

添加以下注册表值:

  • 值名称:DisableNTLMPreAuth
  • 数据类型:REG_DWORD
  • 值:

若要在 IIS 中修改此行为,请禁用 IIS Web 应用程序的内核模式身份验证:

  1. 通过从管理命令提示符运行以下命令打开 Internet Information Services (IIS) 管理器:

    %windir%\System32\inetsrv\inetmgr.exe
    
  2. “连接 ”窗格中,展开服务器名称、“ 站点”,然后展开要为其禁用内核模式身份验证的站点、应用程序或 Web 服务。

  3. 滚动到“主页”窗格中的“安全性”部分,然后双击“身份验证”。

  4. 在“身份验证”页中,选择“Windows 身份验证”。

  5. 在“操作”窗格中选择“高级设置”。

  6. 出现“高级设置”对话框时,清除“启用内核模式身份验证”复选框。

  7. 选择“确定关闭“高级设置”对话框。

重要

禁用内核模式身份验证可能会导致需要 Kerberos 身份验证和委派失败的 Web 应用程序。

详细信息

若要确定提示是否由本文中所述的问题引起,请使用 Fiddler 工具。 使用该工具查看请求的 HTTP 请求/响应流量,从而在 Internet Explorer(或 Microsoft Edge 中的 Internet Explorer 模式)中出现提示。 还需要 IIS 服务器的 IIS 日志来确认 HTTP 状态和子状态代码。 以下示例使用 Internet Explorer 来说明此行为:

  1. 启动 Fiddler 工具并启用流量捕获。

  2. 浏览到 IIS Web 应用程序,以便生成凭据提示。

  3. 在 Fiddler 中,查找导致 401 的请求。 查看原始请求和响应视图,你将看到类似于以下条目:

    请求标头:

    GET /App1/default.aspx HTTP/1.1
    Accept-Language: en-US
    Accept-Encoding: gzip, deflate
    Connection: Keep-Alive
    Host: websitename
    Cookie: ASP.NET_SessionId=jdzbfpnmacq0jykhxnhqhe3j
    Authorization: Negotiate
    <header content omitted>
    

    响应标头

    HTTP/1.1 401 Unauthorized
    Content-Type: text/html
    Server: Microsoft-IIS/7.5
    WWW-Authenticate: Negotiate
    WWW-Authenticate: NTLM
    X-Powered-By: ASP.NET
    Date: Wed, 22 Aug 2012 17:41:09 GMT
    Content-Length: 1293
    Proxy-Support: Session-Based-Authentication
    

备注

对 Web 应用程序的初始请求已包含 Authorization 标头,然后会导致 401 响应。 相应的 IIS 日志应显示如下所示的条目:

2012-08-22 17:41:09 2001:4898:0:fff:200:5efe:157.59.113.72 GET /App1/default.aspx - 80 - 2001:4898:0:fff:0:
5efe:172.18.100.183 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+SLCC2;+.NET+CLR+
2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0;+.NET4.0C;+.NET4.0E;+InfoPath.3;+MS-
RTC+EA+2;+BRI/1;+Zune+4.7;+MS-RTC+LM+8;+BRI/2;+Creative+AutoUpdate+v1.41.02) 401 1 2148074254 5005

HTTP 状态和子状态为 401.1,映射到 由于凭据无效而拒绝访问。

有关详细信息,请参阅以下文档: