3

У меня есть виртуальный каталог на IIS 5.1 с двумя страницами aspx. Доступ к параметру Page1 настроен как опция «Встроенная проверка подлинности Windows», а анонимный доступ отключен. Страница2 доступна через анонимный доступ. На стороне клиента есть объект XmlHttpRequest, который может отправлять запросы, содержащие данные POST, на эти страницы.Почему Content-Length равен 0 при отправке запроса POST с объектом XMLHttpRequest?

Сначала я пытаюсь отправить запрос на страницу. Появляется стандартный диалог проверки подлинности Windows, я вводя свои учетные данные и Page 1 успешно получаю данные POST. После этого я пытаюсь сделать тот же запрос POST для страницы 2, к которому можно получить доступ анонимно. И в этом случае Request имеет заголовок Content-Length = 0, и никакие данные не были отнесены.

Если повторить запрос к Page1 - он успешно получает данные POST. Тот же код работает хорошо в Firefox 3.5. Page2 может получать данные даже после отправки запроса на проверку подлинности Windows Page1. Что может быть неправильным? И, возможно, это какая-то обходная проблема для этой проблемы?

Спасибо!

Передача данных:

function sendRequest() { 
    var url = "http://tom/AuthTest/Default.aspx"; 
    var data = "data"; 
    reqSend(url, data); 
} 

function sendRequestToWinAuth() { 
    var url = "http://tom/AuthTest/DefaultWA.aspx"; 
    var data = "newdata"; 
    reqSend(url, data); 
} 

function reqSend(url, data) { 
    var xmlhttp = createRequestObject(); 
    if (!xmlhttp) { 
    alert("Cannot create XMLHttpRequest object."); 
    return; 
    } 
    try { 
    xmlhttp.open("POST", url, false); 
    xmlhttp.send(data); 
    } 
    catch (ex) { 
    alert("Error: " + ex.message); 
    } 
} 

Запрос на Page1:

POST /AuthTest/DefaultWA.aspx HTTP/1.1 
Accept: */* 
Referer: http://tom/AuthTest/client/testauth.html 
Accept-Language: ru 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) 
Host: tom 
Content-Length: 7 
Connection: Keep-Alive 
Cache-Control: no-cache 
Cookie: innovator_user=admin 
Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAF4AAAAYABgAdgAAAAoACgBIAAAABgAGAFIAAAAGAAYAWAAAAAAAAACOAAAABYKIogUBKAoAAAAPcwBjAGEAbgBkAHQAbwBtAFQATwBNAGUdQIkWMQ6PAAAAAAAAAAAAAAAAAAAAAAo3goJdI7RH9poJwnjypksH2F2pIzbEOQ== 

newdata 

Запрос Page2:

POST /AuthTest/Default.aspx HTTP/1.1 
Accept: */* 
Referer: http://tom/AuthTest/client/testauth.html 
Accept-Language: ru 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) 
Host: tom 
Connection: Keep-Alive 
Cache-Control: no-cache 
Cookie: innovator_user=admin 
Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFASgKAAAADw== 
Content-Length: 0 
+0

я думаю, что это относится к http://stackoverflow.com/questions/328281/why-content-length-0-in-post-requests – Janning

ответ

1

Кажется, я нашел способ сохранить страницы, требующие проверки подлинности Windows, и страниц, разрешающих анонимный доступ на одном сайте.

Там 2 способа сделать это:

  1. Это поведение (ошибка) воспроизводящий только при использовании проверки подлинности NTLM. Поэтому, чтобы избежать этого, мы можем настроить режим аутентификации Kerberos на сайте IIS. Вот подробный FAQ по IIS и Kerberos: http://www.adopenstatic.com/faq/

    Чтобы сказать правду, я попытался следовать первому пути, но на самом деле мой IIS не хочет использовать Kerberos в любом случае. С другой стороны, я пытаюсь проверить эту ситуацию на другой машине - и был удивлен - по умолчанию была использована аутентификация Kerberos. Я попытался найти любую разницу в конфигурациях, но не удался. Таким образом, существует второй способ:

  2. Использование режима проверки подлинности Windows в каталоге или файле в отдельном каталоге. Например, у нас есть какая-то структура, как:

    • ../Default.aspx
    • ../auth/DefaultWinAuth.aspx
    • ../auth/DefaultWinAuth2.aspx

    Мы можем установить режим аутентификации IWA (Integrated Windows Authentication) в каталоге «auth» или на странице DefaultWinAuth. После этого все файлы и подкаталоги, которые включены в эту папку или расположены на том же уровне, что и страница «DefaultWinAuth.aspx», не смогут получать данные POST. Но все остальные файлы и каталоги вне каталога auth будут работать нормально.

1

У меня была эта проблема точно, по-видимому, его дизайн в IE , проверьте эту ссылку: http://www.websina.com/bugzero/kb/browser-ie.html

В основном IE не будет отправлять данные POST на не прошедший проверку URL/страницу, если вы в настоящее время находитесь на аутентифицированном URL/странице. Я не нашел работы, мне нужно было сделать что-то еще, но дайте мне знать, если вы поймете путь. Cheers

+0

Спасибо и за ответ, это полезная ссылка для меня. Но я обнаруживаю интересную вещь. Отправка данных на страницу без проверки подлинности, которая успешно работает в IE, если IIS Server находится на удаленной машине. Он работает не только на локальной машине. Я думаю, что это должно быть связано с использованием аутентификации Kerberos на удаленной машине и базовой аутентификацией NTLM на локальном компьютере. Итак, возникает новый вопрос - если есть какой-либо способ использовать Kerberos вместо NTLM на локальной машине? – Vitaly

+0

IE не позволяет серверу требовать Kerberos. У клиентов может быть включен «Включить встроенную проверку подлинности Windows» на клиентской машине, и эти клиенты будут пытаться использовать NTLM при вызове для переговоров. Простейшим решением является необходимость аутентификации для обеих страниц. – EricLaw