我不确定这是否是编码问题或服务器设置问题,所以我将其发布在堆栈溢出和这里...
在我们的生产站点上,我们遇到了特定于 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 应用程序失败。