C # Сетевые учетные данные не передаются на сервер? - PullRequest
3 голосов
/ 17 августа 2011

Редактировать: Использование:

byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(user + ":" + password);
wr.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);

Кажется, работает нормально.

У меня есть приложение, которое связывается с CMS. В настоящее время я пытаюсь, чтобы этот клиент мог загружать текстовые / XML-данные в CMS с помощью метода «POST».

Я могу передать это с помощью curl:

curl -u user:password -H "Content-Type:text/xml" -d "<element>myXML</element>" serverURL

Однако, пытаясь использовать HttpWebRequest в C #, я не могу заставить сервер вернуть то, что я хочу. Итак, я запустил Wireshark и посмотрел на то, что на самом деле проходило, и это почти идентично, за исключением того факта, что при использовании curl я вижу:

Authorization: Basic <a bunch of hex>=\r\n
Credentials: user:password

В полях заголовка HTTP, когда в выводе моего клиента эти поля заголовка просто отсутствуют. («Credentials:» на самом деле не существует в виде обычного текста, это поддерево «Authorization:» - поэтому я не уверен, откуда оно берется, но имя пользователя и пароль верны.)

Код C #, который я пытаюсь использовать для установки учетных данных для веб-запроса, выглядит примерно так:

NetworkCredential myCred = new NetworkCredential(
                    user, password, serverURL);

CredentialCache myCache = new CredentialCache();

myCache.Add(new Uri(serverURL), "Basic", myCred);

HttpWebRequest wr = (HttpWebRequest) HttpWebRequest.Create(serverURL);
wr.Credentials = myCache;

Я тоже пытался просто установить учетные данные (без указания serverURL):

wr.Credentials = new NetworkCredential(user,password,serverURL);

Но это все еще не делает его обнаруженным в wireshark. Кто-нибудь есть идеи, если:

A) Эта информация об авторизации должна быть в заголовке HTTP, чтобы это работало, и

B) Если это так, то как мне заставить C # вставить это? Кажется, я могу только найти достойные примеры, используя учетные данные по умолчанию, что не относится к тому, что я делаю.

Заранее спасибо.

1 Ответ

5 голосов
/ 17 августа 2011

.NET WebRequest имеет ужасающее поведение по умолчанию, при котором он отправляет учетные данные только после получения ответа HTTP 401 не авторизован.

Ручное добавление заголовка учетных данных (как вы сделали), кажется, лучшее доступное решение.

Подробнее в этом посте

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