2017-02-14 23 views
0

У меня есть веб-приложение, которое размещено в IIS 7.5 на Windows Server 2008 R2 и на другом тестовом компьютере в IIS 8.5 на Windows Server 2012 R2. Аутентификация Windows включена, а пул приложений запущен под учетной записью службы, например «DomainName \ DomainUsername».IIS 7.5 Веб-приложение возвращается Неавторизованный при использовании HttpClient

Я использую небольшое тестовое приложение для C# Console, чтобы запутать объект HttpClient и вызвать действие контроллера на веб-сайте, например. http://localhost/Api/TestAction. Обе тестовые системы ведут себя по-разному, и я не понимаю, почему.

  • Test Case 1) без учетных данных
  • Test Case 2) с "по умолчанию учетные данные"
  • Test Case 3) с учетными данными пользователя в AppPool ("DomainName \ DomainUsername")

TestCase 1:

HttpClient client = new HttpClient(); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

TestCase 2:

HttpClientHandler handler = new HttpClientHandler(); 
handler.UseDefaultCredentials = true; 
HttpClient client = new HttpClient(handler); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

TestCase 3:

HttpClientHandler handler = new HttpClientHandler(); 
handler.Credentials = new NetworkCredential(username, password); 
HttpClient client = new HttpClient(handler); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

Вот результаты:

Windows Server 2008 R2 (IIS 7.5):

  • Test Case 1 - Несанкционированное
  • Test Case 2 - OK
  • Тестовый корпус 3 - Несанкционированный

Windows Server 2012 R2 (IIS 8.5):

  • Test Case 1 - Несанкционированное
  • Test Case 2 - OK
  • Test Case 3 - OK

Могли бы вы пожалуйста, помогите мне понять, почему обе тестовые системы дают разные результаты для тестового примера 3 (используя учетные данные пользователя приложения)? И не могли бы вы объяснить, что означает «UseDefaultCredentials» и какое влияние это оказывает на проблему авторизации? До сих пор я не нашел объяснений, которые я понимаю.

Спасибо!

+0

Существует что-то странное код: Вы вызываете метод GetAsync без реализации обработчика завершения запроса. В общем, ваш объект ответа будет находиться в неопределенном состоянии до тех пор, пока запрос не будет обработан. Если вы посмотрите на описание метода в MSDN, он явно заявляет: «Эта операция не будет блокирована. Возвращенный объект задачи будет завершен после того, как будет прочитан весь ответ (включая контент)». Если вы не хотите иметь дело с обработчиком завершения запроса, вы можете вместо этого использовать webClient.DownloadData. Это синхронная операция, которая не требует обработчика завершения. –

+1

@VictorHavin: ссылаясь на «Результат» асинхронного вызова, он синхронизирует и получает результат асинхронной задачи. Тогда нет необходимости в каких-либо обработчиках завершения. –

+0

@Delerium: не могли бы вы проверить, что произойдет, если вы вызываете конструктор 'NetworkCredentials' с тремя аргументами, а не двумя, а третий - именем домена? –

ответ

1

Ответ принят ОРОМ в обсуждении ниже вопроса включает вызов NetworkCredentials конструктора с три аргументами, а не два, третьим из которых является доменным именем.

Другими словами, это один работает

NetworkCredentials("Username", "Password", "Doamin") 

где это один не

NetworkCredentials("Domain\Username", "Password") 

 Смежные вопросы

  • Нет связанных вопросов^_^