2011-01-12 2 views
25

Я хотел бы знать, почему мое приложение asp.net не добавит заголовок к моему сообщению, когда он называется «Авторизация», но будет работать нормально, когда я сменил один символ, скажем «Авторизация». В документации для других сайтов они всегда используют имя «Авторизация», поэтому я хотел бы также, и на данный момент я просто хочу понять, почему.Заголовок авторизации HTTP ASP.NET

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

Вот мой код ниже:

string fileName = "c:\\xyz.xml"; 
string uri = "http://myserver/Default.aspx"; 
req = WebRequest.Create(uri); 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
byte[] authBytes = Encoding.UTF8.GetBytes("DDSServices:jCole2011".ToCharArray()); 
req.Headers.Add("Authorization", "BASIC " + Convert.ToBase64String(authBytes)); 
req.Headers.Add("test", "test"); 
UTF8Encoding encoder = new UTF8Encoding(); 
byte[] data = encoder.GetBytes(this.GetTextFromXMLFile(fileName)); 
req.ContentLength = data.Length; 
Stream reqStream = req.GetRequestStream(); 
reqStream.Write(data, 0, data.Length); 
reqStream.Close(); 
req.Headers.Add("Authorization", "BASIC" + Convert.ToBase64String(authBytes)); 
System.Net.WebResponse response = req.GetResponse(); 
System.IO.StreamReader reader = new StreamReader(response.GetResponseStream()); 
string str = reader.ReadToEnd(); 

Другой раздражает это, когда я добавить наблюдаемой переменной через стельку он работает отлично.

ответ

11

Для базовой авторизации HTTP вы должны использовать свойство Credentials.

req.Credentials = new NetworkCredential("DDSServices", "jCole2011");

Это должно делать то, что вы хотите. Вместо установки заголовка авторизации.

+0

или есть логическая причина? У очень большой сторонней компании, с которой мы работаем, есть документация с их авторизацией таким же образом, поэтому я хотел бы знать причину. – Cody

+1

Гораздо лучше использовать подход NetworkCredential, как предполагает Уилл. Тем не менее, ваш подход также должен работать нормально, хотя я не понимаю, почему вы делаете это дважды (один перед вызовом GetRquestStream и один раз после этого. Вы должны сделать это сразу после того, как вы вызовете GetRequestStream. Если он все еще не работает, журнал трассировки. Инструкции по адресу http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html – feroze

+0

Можете ли вы рассказать мне, почему это лучше? Или где я могу прочитать о том, почему это лучше? кажется, NetworkCredentials будет привязан к проверке объявлений или форм, я бы предпочел, чтобы соединение было через анонимное, а затем просто проверило. В любом случае, может кто-то просто скажет мне, почему? Я почти не забочусь о том, что на данный момент. – Cody

3

NetworkCredential - хорошее решение, но сайт, который вы вызываете, должен обрабатывать неавторизованный заголовок 401 и WWW-Authenticate в ответе.

Клиент:

request.Credentials = new CredentialCache {{aUri, "Basic", new NetworkCredential(aUserName, aPassword)}}; 

Сервер:

Response.ClearContent(); 
Response.StatusCode = 401; 
Response.AddHeader("WWW-Authenticate", "Basic"); 
Response.End(); 

Это приведет к 2 обращений к серверу. Первоначальный вызов будет отправлен на сервер без учетных данных. Когда сервер отвечает заголовком 401 и WWW-Authenticate (с требуемым типом аутентификации), запрос будет повторно отправлен с учетными данными в запросе.

+3

Это правда, но отправка 401 несанкционированных, а заголовок WWW-Authenticate является частью спецификации HTTP. Если вы хотите принудительно отправить заголовок по первому запросу, вы можете сделать это с помощью метода PreAuthenticate. В дополнение - IIS автоматически обрабатывает отправку этого ответа, как и другие хорошо написанные HTTP-серверы, такие как Apache. Как браузеры знают, что отображается диалоговое окно подсказки пароля. –

41

У меня возник вопрос о том, как добавить аутентификацию/учетные данные в заголовки. Я нашел решение следующим образом.

string _auth = string.Format("{0}:{1}", "myUser","myPwd"); 
string _enc = Convert.ToBase64String(Encoding.ASCII.GetBytes(_auth)); 
string _cred = string.Format("{0} {1}", "Basic", _enc); 
req.Headers[HttpRequestHeader.Authorization] = _cred; 

Который дал мне те заголовки, которые я хочу (склеенные описания Wireshark),

Авторизация: Basic bXlVc2VyOm15UHdk \ г \ п
Полномочия: MyUser: myPwd

+0

Итак, как вы знаете, что кодировка для использования ASCII? –

+1

Хорошая точка. Выбранная кодировка выглядит как возможный «трудно найти» - источник для ошибок. Я добавляю ссылку http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic-authentication для читателей, чтобы найти больше информации о том, как ее решить. – Independent

Смежные вопросы