Принудительная базовая аутентификация в WebRequest - PullRequest
50 голосов
/ 04 мая 2010

Я интегрирую веб-сервис, который будет использовать HTTP-POST для запроса и получения данных. Удаленный сервер требует базовой аутентификации согласно RFC 2617

Мои попытки аутентификации провалились.

В этом случае происходит сбой, даже если я присоединяю объект 'NetworkCredential' к свойству 'Credentials' объекта 'HttpWebRequest', информация аутентификации в заголовке не отправляется даже если я установлю «PreAuthenticate» = true.

Чего мне не хватает?

// кусок используется

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");

Uri uri = new Uri("http://address of services");

ICredentials credentials = netCredential.GetCredential(uri, "Basic");

objRegistration.Credentials = credentials;

objRegistration.PreAuthenticate = true;

Ответы [ 4 ]

112 голосов
/ 16 июля 2010

Я только что нашел этот очень удобный маленький кусок кода , чтобы делать именно то, что вам нужно. Он добавляет заголовок авторизации в код вручную, не дожидаясь вызова сервера.

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}

Используйте это так

var request = WebRequest.Create("http://myserver.com/service");
SetBasicAuthHeader(request, userName, password);

var response = request.GetResponse();
7 голосов
/ 17 декабря 2015

Улучшение немного на принятом ответе Самуэля-Джека. Вместо использования кодировки по умолчанию «ISO-8859-1» следует использовать, как указано в этом ответе Какую кодировку следует использовать для базовой аутентификации HTTP?

Таким образом, код будет выглядеть так:

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}
3 голосов
/ 07 мая 2015

Я нашел этот вопрос, когда искал ответ, данный ответ работает, но он не гибкий, поэтому, если вы хотите лучший способ .NET сделать это.

Uri uri = new Uri("http://address of services");

HttpWebRequest objRegistration = (HttpWebRequest)WebRequest.Create(url);

CredentialCache credentials = new CredentialCache(); 

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");

credentials.Add(uri, "Basic", netCredential);

objRegistration.Credentials = credentials;

Вы можете заменить «Basic» на «Digest», «NTLM» или «Negotiate», а также это дает возможность добавлять несколько типов в кеш.

2 голосов
/ 08 февраля 2015

Вот мое решение для OAuth. Значение находится в переменной json.

var myUri = new Uri(fullpath);
var myWebRequest = WebRequest.Create(myUri);
var myHttpWebRequest = (HttpWebRequest)myWebRequest;
myHttpWebRequest.PreAuthenticate = true;
myHttpWebRequest.Headers.Add("Authorization", "Bearer " + AccessToken);
myHttpWebRequest.Accept = "application/json";

var myWebResponse = myWebRequest.GetResponse();
var responseStream = myWebResponse.GetResponseStream();
if (responseStream == null) return null;

var myStreamReader = new StreamReader(responseStream, Encoding.Default);
var json = myStreamReader.ReadToEnd();

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