Подтвердить что ты не робот

HttpWebRequest не передает учетные данные

Я пытаюсь использовать 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();
4b9b3361

Ответ 1

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

CredentialCache cc = new CredentialCache();
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password"));
request.Credentials = cc;

Ответ 2

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

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);

Ответ 3

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

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

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

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

  • Выполните не аутентифицированный HttpWebRequest в URI https://.../.
  • Получите ответ 401 Unauthorized.
  • Выполните тот же запрос, теперь с установкой Credentials (не уверен, что PreAuthenticate должен быть true или false; проверьте оба).
  • Теперь вы должны получить 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);

Ответ 4

Попробуйте установить request.PreAuthenticate в true.