热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

htmlajax实现ntlm,从一个AJAXPOST获取NTLM挑战只需一页

在这里颇为神秘。我有一个使用Windows身份验证的ASP.NETMVC4Web应用程序,已经维护了18个月以上,没有问题。最近,它被部署

在这里颇为神秘。我有一个使用Windows身份验证的ASP.NET MVC 4 Web应用程序,已经维护了18个月以上,没有问题。最近,它被部署到一个新的网站,我遇到了以下非常奇怪的行为。从一个AJAX POST获取NTLM挑战只需一页

我正在使用jQuery 1.8.2 $.ajax调用POST数据到服务器端点来更新数据。这工作得很好,除了在一个页面上,AJAX POST触发新的NTLM协商。 Chrome,IE和Firefox中也出现同样的问题。尽管这一问题是在所有的浏览器一样,它体现在略微不同的方式:

的Firefox:从服务器接收到一个401质询响应,并提出了一个用户名/密码对话框中无限循环要求的凭证。取消凭证检查会导致请求失败并显示未经授权的响应。

IE:服务器没有响应,请求状态在网络监视器中显示为“(中止)”

Chrome:服务器没有响应,请求状态在网络监视器中显示“(失败)” 。

核心问题似乎是Connection: keep-alive标头没有与有问题的AJAX请求一起发送,但在其他情况下。但是,底层Javascript代码几乎相同,并且AJAX调用在也设置为使用Windows身份验证的开发环境中正常工作。

此外,试图在beforeSend回调中设置Connection请求标头没有任何效果。非常感谢您对问题根源的任何洞察,或解决两个AJAX POST之间存在差异的方法。

工作代码和请求头

$.ajax({

url: url,

type: "POST",

data: $("#myForm").serialize(),

cache: false,

success: function (response) {

}

});

Accept:*/*

Accept-Encoding:gzip, deflate

Accept-Language:en-US,en;q=0.8

Connection:keep-alive

Content-Length:621

Content-Type:application/x-www-form-urlencoded; charset=UTF-8

Host:www.xxx.yyy.zzz

Origin:http://www.xxx.yyy.zzz

Referer:http://www.xxx.yyy.zzz/app/resource/path

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36

X-Requested-With:XMLHttpRequest

失败代码和请求头

$.ajax({

url: url,

type: "POST",

data: data,

cache: false,

success: function (data, status, xhr) {

}

});

WARN: Provisional headers are shown

Accept:*/*

Content-Type:application/x-www-form-urlencoded; charset=UTF-8

Origin:http://www.xxx.yyy.zzz

Referer:http://www.xxx.yyy.zzz/app/resource/item/1

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36

X-Requested-With:XMLHttpRequest

我也看了在Chrome chrome://net-internals/#events观众网络的过程。以下是失败请求中的事件日志与偏离成功日志的位置的关系。如果失败的请求获得“HTTP/1.1 401 Unauthorized”,成功的请求将获得“HTTP/1.1 200 OK”响应,可能是由于存在Connection: keep-alive标头。

2303: URL_REQUEST

Start Time: 2015-04-28 13:53:41.788

t=14736 [st= 0] +REQUEST_ALIVE [dt=71]

t=14736 [st= 0] URL_REQUEST_DELEGATE [dt=0]

t=14736 [st= 0] +URL_REQUEST_START_JOB [dt=70]

--> load_flags = 2688000 (BYPASS_DATA_REDUCTION_PROXY | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT)

--> method = "POST"

--> priority = "LOW"

--> upload_id = "0"

--> url = "http://..."

t=14736 [st= 0] URL_REQUEST_DELEGATE [dt=0]

t=14736 [st= 0] HTTP_CACHE_GET_BACKEND [dt=0]

t=14736 [st= 0] URL_REQUEST_DELEGATE [dt=0]

t=14736 [st= 0] +HTTP_STREAM_REQUEST [dt=0]

t=14736 [st= 0] HTTP_STREAM_REQUEST_BOUND_TO_JOB

--> source_dependency = 2305 (HTTP_STREAM_JOB)

t=14736 [st= 0] -HTTP_STREAM_REQUEST

t=14736 [st= 0] +HTTP_TRANSACTION_SEND_REQUEST [dt=0]

t=14736 [st= 0] HTTP_TRANSACTION_SEND_REQUEST_HEADERS

--> POST ... HTTP/1.1

Host: www.xxx.yyy.zzz

Connection: keep-alive

Content-Length: 105

Accept: */*

Origin: http://www.xxx.yyy.zzz

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36

X-Requested-With: XMLHttpRequest

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

Referer: http://www.xxx.yyy.zzz/app/resource/item/1

Accept-Encoding: gzip, deflate

Accept-Language: en-US,en;q=0.8

t=14736 [st= 0] HTTP_TRANSACTION_SEND_REQUEST_BODY

--> did_merge = true

--> is_chunked = false

--> length = 105

t=14736 [st= 0] -HTTP_TRANSACTION_SEND_REQUEST

t=14736 [st= 0] +HTTP_TRANSACTION_READ_HEADERS [dt=0]

t=14736 [st= 0] HTTP_STREAM_PARSER_READ_HEADERS [dt=0]

t=14736 [st= 0] HTTP_TRANSACTION_READ_RESPONSE_HEADERS

--> 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

X-UA-Compatible: IE=9

Date: Tue, 28 Apr 2015 18:53:41 GMT

Content-Length: 1293

编辑

与从控制台不同请求播放周围给出的结果的下表(下铬)。目前的基本URL是http://IPAddress /app/topic/item和所有测试只需执行$.ajax({ url: url, type: 'POST' })

+--------------------------------------+----------------------------+

| URL | Response |

+--------------------------------------+----------------------------+

| http://IP/app/topic/item/1/subitem/1 | net::ERR_INVALID_HANDLE |

| //IP/app/topic/item/1/subitem/1 | net::ERR_INVALID_HANDLE |

| /app/topic/item/1/subitem/1 | net::ERR_INVALID_HANDLE |

| 1/subitem/1 | net::ERR_INVALID_HANDLE |

| 1/foo | 404 (Not Found) [expected] |

| 1 | 302 (Redirect) [expected] |

+--------------------------------------+----------------------------+

因为错误只影响一个控制器的POST操作方法的一个子集,我最初以为这是一个服务器端的问题,但在发现缺少Connection标题的问题后,它实际上似乎是客户端问题。问题究竟如何触发对我来说仍然是一个谜。

我也确认了工作页面和问题页面的响应标题是相同的。最相关的是,在两种情况下总是返回Persistent-Auth: true标题。

2015-04-28

Lucas

+0

您是否尝试过从'ajax'调用执行'error'处理程序?你可能在这里得到一些额外的信息? –

+0

@christiandev是的。 Chrome返回一个net :: ERR_INVALID_HANDLE错误代码,IE的错误代码为12019,记录为ERROR_INTERNET_INCORRECT_HANDLE_STATE。 Firefox也会报告“无效句柄”。 –

+0

另一件事,我添加了匹配所有[POST]路由的[GET]路由,以防万一这是对IE和IWA已知的GET-before-POST问题的奇怪表现形式。这没有效果。 –



推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
cc_lzx_530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有