Ответ 1
Для проверки подлинности Windows всегда будет ответ на вызов (401
) для вашего первого запроса.
Если вы контролируете всех клиентов, я считаю, что наиболее практичным решением является реализация операции с минимальной полезной нагрузкой.
Операция void IsAuthenticated()
должна выполняться. Для каждого экземпляра прокси-сервера клиента вы вызываете IsAuthenticated
до UploadChunk
.
Запрос IsAuthenticated
предоставит вам ответ на вызов 401
без отправки большой полезной нагрузки, но будет аутентифицировать соединение. Последующие запросы на это соединение не будут оспорены.
Изменить:
Поведение, описанное мной, похоже, применимо только к IIS 8. Поэтому я внимательно рассмотрел два трассировки http.sys: один для хоста IIS и один для самостоятельной службы.
Хостинг-служба IIS, похоже, использует некоторую оптимизацию в отношении аутентификации. Первый запрос на соединение аутентифицируется с помощью Authenticator Sspi Authenticator
. Последующие запросы аутентифицируются с помощью Fast Authenticator
.
Ни одно из этих событий не присутствует в трассировке самого хоста, что приводит меня к выводу, что самостоятельный хостинг не оптимизирован для проверки подлинности Windows.
http.sys - трассировать собственный хост
Затем я нашел эту запись в блоге, в которой предлагается решение с использованием NTLM, пользовательской привязки и unsafeConnectionNtlmAuthentication
для транспорта HTTP. Если вы хотите использовать NTLM, а проблемы безопасности, выделенные в документации, не являются проблемой это, по-видимому, обеспечивает поведение, которое вы ищете, по трассе http.sys.
http.sys trace - собственный хост с пользовательской привязкой
Для использования сервером привязки
<customBinding>
<binding name="myBinding">
<textMessageEncoding messageVersion="Soap11" />
<httpTransport authenticationScheme="Ntlm" unsafeConnectionNtlmAuthentication="true"/>
</binding>
</customBinding>
Для вашего клиента вы можете использовать обычный basicHttpBinding с безопасностью Ntlm:
<basicHttpBinding>
<binding name="BasicHttpBinding_ITest">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
</binding>
</basicHttpBinding>