1

Я принимаю службу WCF под IIS7 на Win2008R2. Она прекрасно работает в течение нескольких недель, а затем, когда мы делаем что-то вроде перезагрузки сервера, как правило, из-за развертывания, он начинает с возникновением ошибки следующим образом:IIS7 Аутентификация Windows вызывает 0x2746 SocketException

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Basic realm="myrealm.local",Negotiate,NTLM'. System.Net.WebException: The remote server returned an error: (401) Unauthorized.

Я пытался перезапустить все программное обеспечение, никакого эффекта , затем перезапустить сам сервер, и она превращается в ошибку, гласящая:

[SocketException (0x2746): An existing connection was forcibly closed by the remote host] [IOException: Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host.] [WebException: The underlying connection was closed: An unexpected error occurred on a send.] [CommunicationException: An error occurred while making the HTTP request to *. This could be due to the fact that the server certificate is not configured properly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server.]

Журналы IIS показывают только то, что он дает 401 ответа. WFetch показывает сообщение «0x2746 [sockslip]: recv() '

Я исключил клиента, самого сервисного программного обеспечения, разрешений на сервере на сервере и сети.

Если я включаю Анонимную аутентификацию, все работает; выключите его, если включена только проверка подлинности Windows, и он не работает.

Это похоже на проблему аутентификации IIS7, но я не знаю, как это проследить, поскольку трассировка WCF не отображает никакой подсказки, и на сервере не регистрируются исключения.

ПРОЯСНИТЬ В прошлом эта проблема на самом деле, казалось бы, исчезла сама по себе, однако я обнаружил, что после того, как услуга обращались с Anonymous включен, когда он затем выключается, служба продолжает работать в проверке подлинности Windows, до следующего перезапуска.

С уважением, Роб.

+0

Я настоятельно рекомендую вам заменить все экземпляры Vertex/Windows auth на NTLM. Negotiate = Kerberos, который в большинстве случаев переполняется. Kerberos также может быть очень flaky в среде Windows, поскольку существует множество причин, по которым он может потерпеть неудачу. Кроме того, поскольку все это отвлечено, единственная информация, которую вы получаете, когда она терпит неудачу, - это ошибки 401, что может означать, что что-либо из настроек AD неправильное, чтобы синхронизировать проблемы синхронизации (именно там я буду вкладывать свои деньги). – Aron

ответ

1

Хорошо, оказывается, это одно из самых вводящих в заблуждение сообщений об ошибках Microsoft, с которыми я столкнулся.

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

E.g.

Website A 
| 
|--> Application B 

Если параметры проверки подлинности в А являются неправильно, или есть проблема, когда вы пытаетесь получить доступ к B напрямую, вы получите исключение сокета вместо реального ответа. Кажется, что IIS не может сообщить об ошибке из приложения, к которому вы пытаетесь получить доступ, поскольку он не смог «просверлить» основную структуру сайта.

Чтобы избавиться от исключения сокета и увидеть реальное исключение 401, я просто включил анонимную аутентификацию в точке A, разрешив любые проблемы на этом уровне обходить и заставив ошибку исходить из приложения B вместо этого.


Ошибка аутентификации 401 при первоначальном запросе без каких-либо исключений, регистрируемых в средстве просмотра событий.

Ответ представляется использование системы.WebServer -> httpErrors

Как я хотел использовать тильду (~) в URL, я устанавливал мой конфиг к следующему:

<httpErrors> 
    <clear /> 
    <error statusCode="401" responseMode="ExecuteURL" path="~/error.xml" /> 
</httpErrors> 

ли это использование тильды или ExecuteURL, В итоге я обнаружил, что, используя следующие работы:

<httpErrors> 
    <clear /> 
    <error statusCode="401" responseMode="File" path="/error.xml" /> 
</httpErrors> 
Смежные вопросы