HttpWebRequest не передает учетные данные - PullRequest
32 голосов
/ 09 ноября 2009

Я пытаюсь использовать HTTPWebRequest для доступа к службе REST, и у меня возникают проблемы при передаче учетных данных, см. Код ниже. Я читал, что NetworkCredential не поддерживает SSL, и я посещаю HTTPS-сайт. Кто-нибудь знает класс, похожий на NetworkCredential, который поддерживает SSL?

Uri requestUri = null;
Uri.TryCreate("https://mywebserver/webpage", UriKind.Absolute, out requestUri);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
NetworkCredential nc = new NetworkCredential("user", "password");
request.Credentials = nc;
request.Method = WebRequestMethods.Http.Get;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Ответы [ 4 ]

48 голосов
/ 09 ноября 2009

Посмотрите, будет ли оно отображаться при использовании старомодного метода:

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);
26 голосов
/ 09 ноября 2009

Какой механизм аутентификации защищает веб-сервис? Учетные данные, установленные на HttpWebRequest, будут передаваться только через HTTP-заголовок Authorization через Basic , Дайджест или NTLM . Таким образом, если ваша веб-служба защищена с помощью WS-Security, NetworkCredentials, вероятно, вообще не будет передан в схему аутентификации, поскольку WS-Security не работает на уровне HTTP.

Что вам нужно сделать, это создать прокси-клиент веб-службы для веб-службы с помощью инструмента командной строки wsdl.exe или чего-то подобного. Это даст вам доступ к схемам аутентификации с поддержкой веб-служб.

Обновление после комментариев:

Похоже, что HttpWebRequest необходимо получить вызов WWW-Authenticate с 401 Unauthorized, прежде чем он сможет правильно пройти аутентификацию по SSL. Я предполагаю, что в HttpWebRequests есть два отдельных пути кода, обрабатывающих обычный HTTP-трафик и зашифрованный HTTPS-трафик. В любом случае, что вы должны попробовать, это:

  1. Выполнить проверку подлинности HttpWebRequest для https://.../ URI.
  2. Получите ответ 401 Unauthorized.
  3. Выполните один и тот же запрос, теперь с обоими установленными Credentials (не уверен, должно ли PreAuthenticate быть true или false; проверить оба).
  4. Теперь вы должны получить 200 OK или что-то еще, с чем ваш веб-сервис отвечает.

Другой вариант - создать заголовок Authorization самостоятельно по первоначальному запросу:

string credentials = String.Format("{0}:{1}", username, password);
byte[] bytes = Encoding.ASCII.GetBytes(credentials);
string base64 = Convert.ToBase64String(bytes);
string authorization = String.Concat("Basic ", base64);
request.Headers.Add("Authorization", authorization);
21 голосов
/ 09 ноября 2009

Если ваш сервер использует NTLM-аутентификацию, вы можете попробовать это:

CredentialCache cc = new CredentialCache();
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password"));
request.Credentials = cc;
3 голосов
/ 09 ноября 2009

Попробуйте установить запрос. PreAuthenticate для true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...