Принудительная базовая аутентификация в 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;
Ответы
Ответ 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", а также дать возможность добавлять несколько типов в кеш.