2009-06-03 3 views
5

Я пытаюсь использовать HttpWebRequest для получения URI https, для которого требуется имя пользователя и пароль. Если я поместил URI в браузер, появится диалоговое окно с запросом учетных данных и затем будет работать. Использование HttpWebRequest дает мне 401 Несанкционированную ошибку.HttpWebRequest через SSL с учетными данными клиента

В документации для NetworkCredentials говорится, что он не поддерживает SSL, но я не могу найти то, что я должен использовать.

ответ

5

Является ли сервер использованием базовой аутентификации HTTP или каким-либо другим видом? Если он использует HTTP basic, вы можете установить свойство Credentials в веб-запросе на учетные данные, содержащие правильное имя пользователя и пароль, и установить для свойства PreAuthenticate значение true.

Вот пример (это проверялось, поэтому использовать его в качестве единственного ориентира):

var uri = new Uri("https://somesite.com/something"); 
var request = WebRequest.Create(uri) as HttpWebRequest; 
request.Credentials = new NetworkCredential("myUserName","myPassword"); 
request.PreAuthenticate = true; 

var response = request.GetResponse(); 

Примечание: В моем опыте это делает, есть некоторое странное поведение в рамках .NET. Можно подумать, что он должен делать то, что говорит код, но он на самом деле делает это:

  • Отправить запрос на сервер без каких-либо полномочий
  • Сервер отвечает 401
  • Re-Послать запрос с учетными данными, которые Вы дали it
  • Сервер принимает запрос.

Я понятия не имею, почему это было бы так, как будто оно было сломанным, поэтому, возможно, это была причуда моей машины, и, возможно, это не случится с вами.

Если ваше приложение не чувствительно к производительности, а ваши запросы не являются POSTS больших данных, вы, вероятно, не заметите, но чтобы обойти его, мне пришлось вручную создать заголовок базовой аутентификации HTTP и установить его на HttpWebRequest вручную, манипулируя коллекцией Headers.

+0

Я считаю, что поведение, которое вы описываете, такое же поведение, что и wget в * nix. Он пытается один раз и терпит неудачу, а затем отправляет учетные данные и преуспевает. – Stephan

+0

Я думаю, что это какая-то последовательность запросов-запросов, которая является частью спецификации http. – MGOwen