Как «разделить» NTLM-аутентификацию между несколькими HttpWebRequests? - PullRequest
6 голосов
/ 31 августа 2011

Приложение C # подключается к веб-серверу, использующему проверку подлинности NTLM.

Я считаю, что каждый запрос к серверу (с использованием нового запроса HttpWebRequest) проходит индивидуальную аутентификацию. Другими словами, каждый запрос приводит к ответу 401, после чего происходит разговор о рукопожатии NTLM, прежде чем я получу фактический ответ.

например:.

Первый запрос GET:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM)

-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM base64stuff)

-> GET xyz (Authorization: base64stuff)
<- 200

Последующие запросы:

-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided?

-> GET xyz (Authorization: base64stuff)
<- 200

(изначально с PreAuthenticate, установленным в false, последующие запросы выглядели как первый запрос - то есть три базовых запроса на «запрос»)

Есть ли способ «поделиться» аутентификацией, выполненной при первом запросе к серверу, с последующими HttpWebRequests?

Я думал, что, возможно, свойство UnsafeAuthenticatedConnectionSharing позволит мне сделать это, но установка его в true для всех объектов HttpWebRequest, используемых в приложении, не имеет никакого эффекта.

Однако, если я установлю для PreAuthenticate значение true, для каждого запроса после первого запроса будет получен менее 401 ответ.

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

Последний запрос, отправленный после выполнения NTLM (тот, который приводит к ответу 200), содержит заголовок auth, который сообщает серверу, что у вас есть правильные учетные данные.имеет функцию сохранить это самостоятельно, но если вы найдете способ сохранить этот заголовок и добавить его к вашим последующим запросам, он должен работать нормально.нужно держать ваше соединение открытым с помощью заголовка Keep-Alive.Класс клиента должен предоставить некоторые настройки для этого.Для получения дополнительной информации см. Эту страницу, которая я считаю очень полезной и понятной о схеме NTLM:

http://www.innovation.ch/personal/ronald/ntlm.html

1 голос
/ 20 августа 2018

Может быть, это слишком поздно для этого, но вы должны установить для свойства UnsafeAuthenticatedConnectionSharing значение true в WebRequestHandler (оно расширяет HttpClientHandler).

Таким образом, соединения поддерживаются, позволяя HttpClient«делиться» аутентификацией среди других запросов, позволяя в то же время поддерживать соединения (вы не можете сделать это вручную, даже установив заголовок самостоятельно).Имейте в виду, что у вас также должна быть соответствующая постоянная авторизация на сервере: либо authPersistNonNTLM для Kerberos, либо authPersistSingleRequest для NTLM.

...