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

Заголовок авторизации HTTP ASP.NET

Я хотел бы знать, почему мое приложение 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();

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

4b9b3361

Ответ 1

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

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\r\n
Учетные данные: myUser: myPwd

Ответ 2

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

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

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

Ответ 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 (с требуемым типом аутентификации), запрос будет повторно отправлен с учетными данными в запросе.