2009-07-29 3 views
5

У меня есть сервер VB6 для классического сайта ASP. Затем VB вызывает веб-службу на том же сервере, используя MSXML2.XMLHTTP. Это работает на всех наших серверах, кроме одного. Если я установил сайт веб-службы для приема анонимного входа, он будет работать, однако, если я наведу только интегрированную безопасность, MSXML вернет ошибку Access Denied.Доступ запрещен с использованием MSXML

Я использую код из примера here.

Set objDom = CreateObject("MSXML2.DOMDocument") 
Set objXmlHttp = CreateObject("MSXML2.XMLHTTP") 

' Load XML 
objDom.async = False 
objDom.loadXML XmlBody 

' Open the webservice 
objXmlHttp.Open "POST", AsmxUrl, False 

' Create headings 
objXmlHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
objXmlHttp.setRequestHeader "SOAPAction", SoapActionUrl 

' Send XML command 
objXmlHttp.send objDom.xml 

Edit: Следуя совету AnthonyWJones я пошел вниз контрольный список, и он до сих пор не работает. Используя Fiddler, он показывает один запрос с ответом 401. На закладке проверки подлинности отображается:

No Proxy-Authenticate Header is present. 
WWW-Authenticate Header is present: Negotiate 
WWW-Authenticate Header is present: NTLM 

Я заметил странное поведение. Когда я вызываю веб-сайт, используя учетные данные пользователя, зарегистрированного на удаленном рабочем столе, он будет работать. Я получаю переговоры, вызов, а затем 200, и он будет работать. Любые идеи, почему это будет работать, когда пользователь войдет в систему через удаленный рабочий стол, но не в другое время?

+1

Какая операционная система работает от сломанного клиента? Является ли имя хоста целевого сервера «равным» (содержит ли оно точки?). Если нет, то назначение в зону интрасети происходит через прокси-скрипт (http://msdn.microsoft.com/en-us/library/bb250483(VS.85).aspx), и, таким образом, если ваше клиентское приложение не является По какой-то причине использовать прокси-сервер, присвоение зоны не удастся, и вы столкнулись бы с таким поведением. – EricLaw

+0

Windows server 2003 R2 - это OS, которую я использую, я использую. Имя хоста целевого сервера является простым и не содержит точек. Если я перейду к веб-сервису с помощью браузера, он будет отображаться как зона локальной интрасети.В разделе «Свойства обозревателя» -> «Соединения» -> «Настройки локальной сети» ни один из трех полей не установлен. Может быть, он пытается использовать другую конфигурацию, когда проводник не загружен для этого пользователя? – Ryan

ответ

3

Я полагаю, что вы полагаетесь на базовый стек HTTP WinINET, чтобы представить текущие учетные данные пользователей на сервер при вызове сервера с помощью встроенной безопасности Windows.

WinINET выполнит это только по умолчанию, если считает, что хост-сервер находится в зоне интрасети. Даже тогда возможно, что настройки безопасности для пользователей Интранет-зоны настроены таким образом, чтобы запретить это.

Попробуйте использовать сайт с браузером с клиентской машины, когда вы входите в систему как тот же пользователь, что и приложение VB6. В какой зоне он считает сервер включенным? Если это не интрасеть, вам нужно будет добавить хост к списку сайтов, принадлежащих этой зоне. Пока вы там открываете параметры безопасности зон и прокрутите страницу до категории «Аутентификация пользователя». Вход в систему должен быть настроен как «Автоматический вход в систему только в зоне интрасети».

Редактировать: Из вашего комментария эти вещи настроены правильно. Несколько вещей, которые я бы хотел: -

  1. Проверить, что сервер строго настроен только для обеспечения безопасности Windows.
  2. Проверьте настройки прокси-сервера на компьютере, разрешено ли разрешение проблемы с прокси-сервером?
  3. Используйте ProgID «MSXML2.XMLHTTP.3.0», чтобы убедиться, что используется правильная версия dll MSXML (некоторые установки других сторонних приложений могут повредить реестр, что приводит к использованию старой версии MSXML).
  4. Установите Fiddler на машину и просмотрите http-разговор, когда приложение VB6 попытается выполнить вызов. Есть ли один ответ 401? WinINET не использует учетные данные пользователя? Есть ли 3 401 ответа? WinINET попытался использовать текущие учетные данные пользователей, но они не принимаются сервером.

Этот пункт мы находимся на территории системного администратора. Например, если трассировка скрипача показывает, что попытка аутентификации не использует NTLM, а затем использует аутентификацию Kerberos, убедитесь, что на сервере и клиенте установлены часы в течение 5 минут друг от друга и контроллера домена.

Проверьте журнал событий серверов, если сервер не может связаться с контроллером домена.

Место простое.htm на сервере с только встроенной системой безопасности Windows и попыткой ударить ее из браузера, удастся ли это?

+0

Веб-служба находится в локальной зоне интрасети и настроена как «Автоматический вход в систему только в зоне интрасети». Любые другие идеи? – Ryan

+0

Спасибо за ваш дополнительный ответ. Я обновил свой вопрос с результатами ваших тестов. Если я просматриваю непосредственно веб-сервис, он работает нормально, у меня возникают проблемы, когда я вызываю его из библиотеки VB. – Ryan

0

Посмотрев на все вещи AnthonyWJones предложил я обнаружил, что я мог бы использовать обычную проверку подлинности, выполнив:

objXmlHttp.Open "POST", AsmxUrl, False, UserName, Password 

Если я позволил комплексной безопасности было бы попытаться договориться, но потом не и 401, но если только основные аутентификация разрешена для подключения. Это не мой первый выбор, но это лучший способ обхода, чем анонимный доступ. Я оставлю это открытым на некоторое время дольше, если кто-то может объяснить, как получить интегрированную безопасность, но затем дать AnthonyWJones принятый ответ, так как его контрольный список хорош и заставил меня найти этот другой вариант.

Fiddler очень помог найти все это.

3

Возможно, слишком поздно ответить Райану, но другие могут иметь такую ​​же проблему, поэтому я опубликую это: у меня есть разработчик, который работает с той же проблемой с MSXML2.XMLHTTP. Дело в том, что у меня есть образцы, которые делают это с обратной стороны, поэтому я знаю, что использовал для работы, но это не сейчас ... может быть, недавно появившаяся ошибка? Мы полагались на автоматическое обнаружение локальной интрасети с помощью стека WinINET, и тогда стек был бы готов сделать Windows Integrated. Сайт был в списке прокси-обозревателя, который со стандартными опциями помещает его в локальную интрасеть. И действительно, когда вы переходите на сайт и переходите на вкладку «Параметры безопасности», вы видите, что локальная интрасеть выделена, поэтому она работает. Тем не менее, MSXML2.XMLHTTP по-прежнему не хочет делать Windows Integrated ... Если вы не добавили сайт в локальную интрасеть, используя кнопки «Сайты/Расширенные» на вкладке «Безопасность».

Таким образом, я пришел к выводу, что в стеке WinINET существует некоторая ошибка, которая обрабатывает автоматически обнаруженные локальные сайты интрасети по-разному, чем те, которые непосредственно добавлены в список Сайтов. Самое смешное, когда просматривает на сайт, все работает так, как надеется, и Windows Integrated используется автоматически (даже без прямого добавления на сайты): это только программный доступ через MSXML2.XMLHTTP, который не работает.

Наконец, это не то, что мы закончили, хотя: вместо этого мы использовали MSXML2.ServerXMLHTTP.6.0. Этот стек (WinHTTP), похоже, все в порядке, однако есть предостережение: он не использует настройки прокси-сервера IE по умолчанию, поэтому у вас есть некоторые опции - используйте ProxyCfg (для XP и более ранних версий) или NETSH для Vista и позже импортировать параметры прокси IE в стек WinHTTP. Нижняя сторона - это дополнительная настройка на каждом клиентском компьютере (это было приложение VB с живым клиентом). То, что мы решили сделать вместо этого поставить следующий раз перед Отправлять:

HTTP.SetProxy 2, «myproxy.mydomain.com», «* .mydomain.com»

Так как вы будете идти на сайт mydomain, вы можете подумать, что вместо этого можете сказать HTTP.SetProxy 0, чтобы обойти прокси-сервер, но это не работает. Стек должен сказать: «У меня есть прокси-сервер, но обходите его для моего домена, и, кстати, сайт, который я собираюсь, находится в этом домене, ergo это локальная интрасеть».

+0

Спасибо за ответ. По-прежнему мне бы хотелось, в случае необходимости, избежать использования базовой аутентификации. – Ryan

Смежные вопросы