401 使用多重身份验证方法 仅限 IE 10

401 使用多重身份验证方法 仅限 IE 10

我不确定这是否是编码问题或服务器设置问题,所以我将其发布在堆栈溢出和这里...

在我们的生产站点上,我们遇到了特定于 Internet Explorer 10 的问题。

我正在使用 jQuery 对同一域上的 Web 服务执行 ajax POST,在 IE10 中我收到 401 响应,而 IE9 运行正常。我应该提到,我们在网站的另一个区域镜像了代码,它在 IE10 中运行正常。这两个区域之间的唯一区别是一个位于子域下,另一个位于根级别。www.my1stdomain.com对阵portal.my2nddomain.com

服务器上的目录结构如下:

\my1stdomain\webservice\name\service.aspx

\portal\webservice\name\service.aspx

\portal\\my1stdomain\文件夹里面我有一个执行 ajax 调用的页面,两个页面是相同的。

$.ajax({
    type: 'POST',
    url: '/webservice/name/service.aspx/function',
    cache: false,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    data: '{ "json": "data" }',
    success: function() {

    },
    error: function() {

    }
});

我已经验证了服务器端两个文件夹的权限是否相同。我已应用解决方法,将 设置<meta http-equiv="X-UA-Compatible" value="IE=9">为强制兼容视图(将 IE 置于兼容模式可修复该问题)。这似乎在 Windows 7 上的 IE10 中有效,但 Windows 8 上的 IE 10 仍然会出现同样的问题。这些页面是经典的 asp,其中包含标题,也没有使用其他元标记。doctype 被指定为<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//" "http://www.w3.org/TR/html4/loose.dtd">在门户页面和<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">主域上。

更新1


我在服务器上使用 Microsoft Network Monitor 3.4 来捕获请求。我使用以下过滤器来捕获 401:

Property.HttpStatusCode.StringToNumber == 401

这是回应

- Http: Response, HTTP/1.1, Status: Unauthorized, URL: /webservice/name/service.aspx/function Using Multiple Authetication Methods, see frame details
    ProtocolVersion: HTTP/1.1
    StatusCode: 401, Unauthorized
    Reason: Unauthorized
  - ContentType:  application/json; charset=utf-8
   - MediaType:  application/json; charset=utf-8
      MainType:  application/json
      charset: utf-8

    Server:  Microsoft-IIS/7.0
    jsonerror:  true
  - WWWAuthenticate: Negotiate
   - Authenticate:  Negotiate
      WhiteSpace:  
      AuthenticateData: Negotiate
  - WWWAuthenticate: NTLM
   - Authenticate:  NTLM
      WhiteSpace:  
      AuthenticateData: NTLM
    XPoweredBy:  ASP.NET
    Date:  Mon, 04 Mar 2013 21:13:39 GMT
    ContentLength:  105
    HeaderEnd: CRLF
  - payload: HttpContentType =  application/json; charset=utf-8
     HTTPPayloadLine: {"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

这里真正引人注目的是

未授权,URL:/webservice/name/service.aspx/function 使用多种身份验证方法

对此,我仍然感到困惑,如果这是权限/身份验证问题,为什么这种情况只发生在 IE10 中。10 中增加了什么,或者我应该在哪里寻找这个问题的根本原因?

更新2


以下是来自 Fiddler 的客户端机器的标头(服务器信息已删除)

主要的

SESSION STATE: Done.
Request Entity Size: 64 bytes.
Response Entity Size: 9 bytes.

== FLAGS ==================
BitFlags: [ServerPipeReused] 0x10
X-EGRESSPORT: 44537
X-RESPONSEBODYTRANSFERLENGTH: 9
X-CLIENTPORT: 44770
UI-COLOR: Green
X-CLIENTIP: 127.0.0.1
UI-OLDCOLOR: WindowText
UI-BOLD: user-marked
X-SERVERSOCKET: REUSE ServerPipe#46
X-HOSTIP: ***.***.***.***
X-PROCESSINFO: iexplore:2644

== TIMING INFO ============
ClientConnected:    14:43:08.488
ClientBeginRequest: 14:43:08.488
GotRequestHeaders:  14:43:08.488
ClientDoneRequest:  14:43:08.488
Determine Gateway:  0ms
DNS Lookup:         0ms
TCP/IP Connect: 0ms
HTTPS Handshake:    0ms
ServerConnected:    14:40:28.943
FiddlerBeginRequest:    14:43:08.488
ServerGotRequest:   14:43:08.488
ServerBeginResponse:    14:43:08.592
GotResponseHeaders: 14:43:08.592
ServerDoneResponse: 14:43:08.592
ClientBeginResponse:    14:43:08.592
ClientDoneResponse: 14:43:08.592

    Overall Elapsed:    0:00:00.104

The response was buffered before delivery to the client.

== WININET CACHE INFO ============
This URL is not present in the WinINET cache. [Code: 2]

门户网站

SESSION STATE: Done.
Request Entity Size: 64 bytes.
Response Entity Size: 105 bytes.

== FLAGS ==================
BitFlags: [ClientPipeReused, ServerPipeReused] 0x18
X-EGRESSPORT: 44444
X-RESPONSEBODYTRANSFERLENGTH: 105
X-CLIENTPORT: 44439
X-CLIENTIP: 127.0.0.1
X-SERVERSOCKET: REUSE ServerPipe#7
X-HOSTIP: ***.***.***.***
X-PROCESSINFO: iexplore:7132

== TIMING INFO ============
ClientConnected:    14:37:59.651
ClientBeginRequest: 14:38:01.397
GotRequestHeaders:  14:38:01.397
ClientDoneRequest:  14:38:01.397
Determine Gateway:  0ms
DNS Lookup:         0ms
TCP/IP Connect: 0ms
HTTPS Handshake:    0ms
ServerConnected:    14:37:57.880
FiddlerBeginRequest:    14:38:01.397
ServerGotRequest:   14:38:01.397
ServerBeginResponse:    14:38:01.464
GotResponseHeaders: 14:38:01.464
ServerDoneResponse: 14:38:01.464
ClientBeginResponse:    14:38:01.464
ClientDoneResponse: 14:38:01.464

    Overall Elapsed:    0:00:00.067

The response was buffered before delivery to the client.

== WININET CACHE INFO ============
This URL is not present in the WinINET cache. [Code: 2]

答案1

您可能需要测试此处描述的客户端注册表设置:

在 Internet Explorer 和 Internet 信息服务中使用预身份验证标头时返回意外的 401.1 状态
http://support.microsoft.com/kb/2749007

客户端测试:

Key: HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/  
Value: DisableNTLMPreAuth  
Data Type: REG_DWORD  
Value: 1  

服务器修复:

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

  • 打开 Internet 信息服务 (IIS) 管理器
  • 在“连接”窗格中,展开服务器名称,展开“站点”,然后展开要禁用内核模式身份验证的站点、应用程序或 Web 服务。
  • 滚动到主页窗格中的“安全”部分,然后双击“身份验证”。
  • 在“身份验证”窗格中,选择“Windows 身份验证”。
  • 单击操作窗格中的高级设置。
  • 出现“高级设置”对话框时,取消选中“启用内核模式身份验证”复选框
  • 单击“确定”关闭“高级设置”对话框。

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

相关内容