Передача имени пользователя и пароля в .NET HttpWebRequest через URI не работает - PullRequest
8 голосов
/ 09 ноября 2011

Выполнение следующего кода:

var request = HttpWebRequest.Create("http://username:password@savanttools.com/test-http-status-codes.asp?code=401");
var response = request.GetResponse();

... и проверка запроса с помощью Wireshark показывает, что мой клиент не предпринимал попыток авторизации (URL-адрес - это простая служба, которая всегда возвращает 401).

Этот код отправляет заголовок авторизации после первоначального вызова:

var request = HttpWebRequest.Create("http://username:password@savanttools.com/test-http-status-codes.asp?code=401");
request.Credentials = new NetworkCredential("username", "password");
var response = request.GetResponse();

Использование класса System.Uri не имеет никакого эффекта.Почему имя пользователя и пароль, переданные в URL, не используются для аутентификации?

(Мне известно о этом сообщении в блоге о передаче заголовка авторизации без первоначального вызова, но это не такпроблема под рукой)

РЕДАКТИРОВАТЬ Я должен добавить, что обойти это ограничение довольно легко, например, с помощью этого небольшого кусочка кода (добавить URL, не выходящий по вкусу), яМне просто любопытно, почему вы должны это сделать:

var userInfo = request.Address.UserInfo;
if (!string.IsNullOrEmpty(userInfo) && userInfo.Contains(':'))
{
    request.Credentials = new NetworkCredential(userInfo.Split(':').First(), userInfo.Split(':').Last());
}

1 Ответ

3 голосов
/ 09 ноября 2011

Класс HttpWebRequest не использует учетные данные в Uri (для dotPeek).

Но FtpWebRequest делает, вот соответствующий код:

if (this.m_Uri.UserInfo != null && this.m_Uri.UserInfo.Length != 0)
  {
    string userInfo = this.m_Uri.UserInfo;
    string userName = userInfo;
    string password = "";
    int length = userInfo.IndexOf(':');
    if (length != -1)
    {
      userName = Uri.UnescapeDataString(userInfo.Substring(0, length));
      int startIndex = length + 1;
      password = Uri.UnescapeDataString(userInfo.Substring(startIndex, userInfo.Length - startIndex));
    }
    networkCredential = new NetworkCredential(userName, password);
  }

Как вы можете видеть, он просто присоединяет его к учетным данным, поэтому вам следует просто сделать это вместо этого вручную с проанализированным Uri

...