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

Принудительная базовая аутентификация в WebRequest

Я интегрирую веб-сервис, который будет использовать 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;
4b9b3361

Ответ 1

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

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();

Ответ 2

Улучшение немного по ответу на samuel-jack. Вместо использования кодировки по умолчанию "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

Здесь мое решение для 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();

Ответ 4

Я нашел этот вопрос, ища ответ, ответ на данный вопрос работает, но не является гибким, поэтому, если вы хотите улучшить .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", а также дать возможность добавлять несколько типов в кеш.