2010-05-04 3 views
47

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

Мои попытки аутентификации терпят неудачу.

Это не удается, хотя я присоединяю объект '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; 
+3

Из MSDN: [ 'WebRequest.PreAuthenticate'] (http://msdn.microsoft.com/en-us/library/system.net.webrequest.preauthenticate(v=vs.110).aspx): ** За исключением первого запроса ** _, ' Свойство PreAuthenticate' указывает, следует ли отправлять информацию аутентификации с ** последующими ** запросами, не дожидаясь вызова сервера_ и ['HttpWebRequest.PreAuthenticate'] (http://msdn.microsoft.com/en-us/library/ system.net.httpwebrequest.preauthenticate (v = vs.110) .aspx): ** После ** _a запрос клиента на конкретный Uri успешно завершена, если «PreAuthenticate» истинна ..._ – Sepster

ответ

107

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

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

кажется, что есть лучший способ, но я все равно проголосую за него;) –

+0

Это правильный ответ, я не знаю, о чем говорит Химаншу. – cgatian

+0

Но почему это не будет работать без этого? – Vedran

2

Вот мое решение для 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(); 
2

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

+0

Я бы не сказал, что этот метод более гибкий , или лучший .Net путь. Установка типа аутентификации и учетных данных в CredentialCache не влияет на/напрямую настроить заголовок «Авторизация». Установка CredentialCache не поможет в ситуации, упомянутой выше (когда нет кода статуса/401 с сервера.). – Denis

7

Улучшение немного на принятом ответе Самуэля-Джек. Вместо того, чтобы использовать кодировку по умолчанию «ISO-8859-1» следует использовать, как указано в этом ответе What encoding should I use for HTTP Basic Authentication?

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

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; 
}