Проверка подлинности NTLM не работает при использовании Windows.Web.HttpClient с параметром AllowUI false

Я портирую свое приложение Windows 8.1 в приложение Windows 10 uwp. Проблема, с которой я столкнулся, заключается в том, что старый код (хотя он все еще компилируется), который использует System.Net.HttpClient, выдает какое-то глупое исключение, когда я пытаюсь аутентифицироваться на сервере с использованием NTLM.

«Известная ошибка Windows 10 SDK - мы ее исправляем». - вся помощь от Microsoft в течение нескольких месяцев. (описано кем-то еще здесь: https://social.msdn.microsoft.com/Forums/en-US/9e137127-e0e5-4aec-a7a9-d66f5b84c70b/rtm-known-issue-systemnethttphttpclient-or-httpwebrequest-class-usage-in-a-uwp-app-throws-a?forum=Win10SDKToolsIssues)

Единственный обходной путь? - «Вместо этого используйте Windows.Web.HttpClient»

Так что я пытаюсь.

var request = new HttpRequestMessage();

request.RequestUri = MyURI;
request.Method = HttpMethod.Post;
request.Content = new HttpStringContent(MyContent);

request.Headers.Add("User-Agent", "MyApp");
request.Headers.Add("SOAPAction", "MySoapAction");
request.Content.Headers.ContentType = new HttpMediaTypeHeaderValue("text/xml; charset=utf-8");

var filter = new HttpBaseProtocolFilter();
filter.AllowAutoRedirect = true;
filter.AllowUI = true;  
filter.ServerCredential = new PasswordCredential(address, username, password);

HttpClient client = new HttpClient(filter);        

var response = await client.SendRequestAsync(httpMessage); 

И это работает! Отображает уродливое системное всплывающее окно над моим приложением с просьбой ввести учетные данные (оно уже заполнено - потому что я установил учетные данные в коде) - после нажатия кнопки ОК статус ответа ОК - все сработало как вред, как и должно.

Так в чем проблема? Проблема в том, что я не хочу показывать это системное всплывающее окно пользователям. Если бы только я установил:

filter.AllowUI = false;

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

Почему? Что я делаю неправильно? Возможно ли, чтобы проверка подлинности NTLM нормально работала в приложениях Windows 10 UWP без всплывающего окна системы? Еще одна проблема с SDK?


person RTDev    schedule 07.01.2016    source источник
comment
Из того, что я читаю, я вижу, что он не выдает второй запрос, когда получает обратно заголовок WWW-Authenticate: NTLM. Если вы выполните его дважды, подтвердится ли второй запрос? ссылка здесь stackoverflow.com/questions / 34070957 /   -  person Bearcat9425    schedule 07.01.2016
comment
какой второй запрос? Я вижу что-то около 10 запросов, отправленных в скрипач - пытается согласовать NTML auth (я думаю) - все с ошибкой 401. Я не могу отправить одно и то же сообщение запроса дважды - говорит об исключении - и когда я создаю все (httpclient, httprequestmessage и фильтр), это тоже не сработает, что приведет к 401   -  person RTDev    schedule 08.01.2016


Ответы (1)


У меня есть решение, которое реализовано аналогичным образом и работает с NTLM. Проверены ли у вас возможности «Enterprise Authentication» и «Internet (Client & Server)», и вы предоставляете домену имя пользователя?

person René Maat    schedule 11.01.2016
comment
У меня проверены возможности Enterprise Authentication, Internet (Client), Internet (Client & Server), Private Networks (Client & Server). Если, предоставляя домен с именем пользователя, вы имеете в виду создание PasswordCredential с правильным доменом, тогда да. - person RTDev; 12.01.2016
comment
Я помню, что у нас была проблема с сервером, на котором были включены как Basic, так и NTLM, так что это может быть что-то для проверки, кроме того, что у меня нет идей. - person René Maat; 12.01.2016