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();
Ответы
Ответ 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.