Почему я не могу заставить HttpWebRequest работать с аутентификацией NTLM - PullRequest
1 голос
/ 06 декабря 2011

Я пытаюсь вызвать EWS из MonoTouch, как в следующем фрагменте:

byte[] bytes = Encoding.UTF8.GetBytes("... some xml here ...");
HttpWebRequest req = WebRequest.Create("https://owa.site.com/ews/exchange.asmx") as HttpWebRequest;
req.Method = "POST";
req.KeepAlive = true;
req.ContentType = "text/xml";
req.ContentLength = bytes.Length;
req.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
CredentialCache ch = new CredentialCache();
ch.Add(req.RequestUri, "Negotiate", new NetworkCredential("uname", "pwd", "domain"));
req.Credentials = ch;
Stream sreq = req.GetRequestStream();
sreq.Write(bytes, 0, bytes.Length);
sreq.Close();
WebResponse resp = req.GetResponse();

В последней строке выдается исключение: 401: не авторизовано.

Не является HttpWebRequestдолжен прозрачно обрабатывать переговоры, т. е. обрабатывать вызов и генерировать второй и третий запрос?

PS Результаты одинаковы как для http, так и для https

PPS. Использование управляемого API EWSсделал успешные вызовы EWS с симулятора (но, к сожалению, он не предназначен для реального устройства).Использование сетевого анализатора на сервере Exchange доказало, что в одном управляемом вызове три HTTP-запроса и только один из приведенного выше кода.

1 Ответ

4 голосов
/ 06 декабря 2011

Исходная NTLM поддерживается Mono и расширением MonoTouch, см .: Поддержка MonoTouch для доступа к Mono.Security.Protocol.Ntlm.NtlmFlags

Однакоболее новые переговоры , которые позволяют аутентификацию в среде только для Kerberos, не поддерживаются Mono (и MonoTouch).

Попробуйте изменить "Negotiate" для "NTLM" ион должен, если это позволяет сеть, работать по старому протоколу.

...