Je voudrais savoir pourquoi mon application asp.net n'ajoutera pas l'en-tête à mon message lorsqu'il est nommé "Autorisation" mais fonctionnera bien lorsque je changerai un caractère, dites "Autorisations". Dans la documentation pour d'autres sites, ils utilisent toujours le nom "Autorisation", donc je voudrais aussi et à ce stade, je veux juste comprendre pourquoi.
J'ai lu quelques sujets à ce sujet mais je n'ai trouvé aucune raison logique pour laquelle.
Voici mon code ci-dessous:
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();
L'autre ennuyeux c'est que lorsque j'ajoute la variable surveillée via un violon, cela fonctionne bien.
J'ai rencontré une question sur la façon d'ajouter l'authentification/les informations d'identification aux en-têtes. J'ai trouvé la solution de la manière suivante.
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;
Ce qui m'a donné les en-têtes que je veux (collé des descriptions de Wireshark),
Autorisation: Basic bXlVc2VyOm15UHdk\r\n
Informations d'identification: myUser: myPwd
Pour l'autorisation de base HTTP, vous devez utiliser la propriété Credentials.
req.Credentials = new NetworkCredential("DDSServices", "jCole2011");
Cela devrait faire ce que vous voulez. Plutôt que de définir l'en-tête d'autorisation.
NetworkCredential est une bonne solution mais le site que vous appelez doit gérer un en-tête non autorisé avec un en-tête 401 ET un WWW-Authenticate dans la réponse.
Client:
request.Credentials = new CredentialCache {{aUri, "Basic", new NetworkCredential(aUserName, aPassword)}};
Serveur:
Response.ClearContent();
Response.StatusCode = 401;
Response.AddHeader("WWW-Authenticate", "Basic");
Response.End();
Cela se traduira par 2 hits sur le serveur. L'appel initial ira au serveur sans informations d'identification. Lorsque le serveur répond avec un 401 ET l'en-tête WWW-Authenticate (avec le type d'authentification requis), la demande sera renvoyée avec les informations d'identification dans la demande.