programing

한 페이지에서만 AJAX POST에서 NTLM 챌린지 받기

powerit 2023. 7. 27. 22:25
반응형

한 페이지에서만 AJAX POST에서 NTLM 챌린지 받기

여기 미스터리가 있네요.ASP를 가지고 있습니다.18개월 이상 문제 없이 유지된 Windows 인증을 사용하는 NET MVC 4 웹 애플리케이션.최근에 새로운 사이트에 배포되었는데, 저는 다음과 같은 매우 이상한 행동을 접했습니다.

1 jQuery 1.8.2 하고 있습니다.$.ajax서버 끝점에 POST 데이터를 호출하여 데이터를 업데이트합니다.이것은 AJAX POST가 새 NTLM 협상을 트리거하는 한 페이지를 제외하고는 잘 작동합니다.Chrome, IE 및 Firefox에서도 동일한 문제가 발생합니다.이 문제는 모든 브라우저에서 동일하지만 다음과 같이 약간 다른 방식으로 나타납니다.

  • Firefox : 서버로부터 401 Challenge 응답을 받고 무한 루프에서 자격 증명을 요청하는 사용자 이름/비밀번호 대화 상자를 엽니다.자격 증명 검사를 취소하면 요청이 실패하고 인증되지 않은 응답이 표시됩니다.
  • IE: 서버에서 응답이 없으며 네트워크 모니터에서 요청 상태가 "(중단됨)"로 표시됩니다.
  • Chrome : 서버에서 응답이 없으며 요청 상태가 네트워크 모니터에 "(실패)"로 표시됩니다.

핵심적인 문제는 다음과 같습니다.Connection: keep-alive헤더가 문제가 있는 AJAX 요청과 함께 전송되지 않지만 다른 경우에 전송됩니다.그러나 기본 JavaScript 코드는 거의 동일하며 AJAX 호출은 Windows 인증도 사용하도록 설정된 개발 환경에서 제대로 작동합니다.

또한, 세트를 시도하는 것.Connection에 있는 beforeSend콜백은 효과가 없습니다.

문제의 근본에 대한 통찰력 또는 두 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://net-internals/#events요청에서 입니다.다음은 성공한 요청에서 벗어난 실패한 요청의 이벤트 로그입니다."HTTP Unauthorized한 요청은 "200 OK"합니다. 는 아마도 "HTTP/1.1 401 Unauthorized", "HTTP/1.1200 OK"가입니다. 이는 아마도 다음과 같은 이유 때문일 것입니다.Connection: keep-aliveheader

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

편집

콘솔에서 다른 요청을 사용하여 재생하면 다음과 같은 결과 표가 나타납니다(Chrome 아래).은 "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헤더는 두 경우 모두 항상 반환됩니다.

몇 가지 엉뚱한 추측:

  • 이 문제는 현재 로그인한 사용자의 클레임에 없는 역할을 요청할 때 발생합니다.사용 중인 경우 확인[Authorize(Roles = "xyz")]현재 사용자가 실제로 해당 역할을 가지고 있습니다.

  • 응용 프로그램이 인증에 쿠키를 사용하는지 여부는 명확하지 않습니다.만약 그렇다면, 당신은 요청과 함께 그것을 봐야 합니다.설정하시겠습니까?withCredentials: true각 요청마다?

NTLM 문제의 원인이 되는 조치 방법에서 어떤 일이 일어나고 있습니까?이러한 특정 작업 방법이 인증이 필요한 프록시를 통해 다른 서버나 인터넷에 액세스하지 않는 것이 확실합니까?개발 환경에서 사용자 또는 IIS에서 앱 풀을 실행하는 사용자는 필요한 권한을 가질 수 있지만 서버의 사용자는 그렇지 않을 수 있습니다.

명확한 보안 관련 예외(ASP)를 던지는 대신.NET은 이를 NTLM 챌린지를 클라이언트에 반환하고 자격 증명이 잘못된 경우 401로 변환합니다. 스택 추적이 포함된 500 대신 서버 계정에 충분한 권한이 없는 경우...

언급URL : https://stackoverflow.com/questions/29928537/getting-an-ntlm-challenge-from-an-ajax-post-on-just-one-page

반응형