boucle avec authentification de L'utilisateur en C#
je veux faire la requête suivante dans c#:
curl -u admin:geoserver -v -XPOST -H 'Content-type: text/xml'
-d '<workspace><name>acme</name></workspace>'
http://localhost:8080/geoserver/rest/workspaces
j'ai essayé d'utiliser une WebRequest:
string url = "http://localhost:8080/geoserver/rest/workspaces";
WebRequest request = WebRequest.Create(url);
request.ContentType = "Content-type: text/xml";
request.Method = "POST";
request.Credentials = new NetworkCredential("admin", "geoserver");
byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes("<workspace><name>my_workspace</name></workspace>");
Stream reqstr = request.GetRequestStream();
reqstr.Write(buffer, 0, buffer.Length);
reqstr.Close();
WebResponse response = request.GetResponse();
...
mais j'obtiens une erreur: (400) mauvaise requête.
si je modifie les justificatifs d'identité de la requête et ajoute l'authentification dans l'en-tête:
string url = "http://localhost:8080/geoserver/rest/workspaces";
WebRequest request = WebRequest.Create(url);
request.ContentType = "Content-type: text/xml";
request.Method = "POST";
string authInfo = "admin:geoserver";
request.Headers["Authorization"] = "Basic " + authInfo;
byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes("<workspace><name>my_workspace</name></workspace>");
Stream reqstr = request.GetRequestStream();
reqstr.Write(buffer, 0, buffer.Length);
reqstr.Close();
WebResponse response = request.GetResponse();
...
puis je reçois: (401) non autorisé.
ma question Est: dois-je utiliser une autre Classe C# comme WebClient ou HttpWebRequest ou dois-je utiliser les fixations curl pour .NET?
tous les commentaires ou conseils seraient appréciés.
3 réponses
authentification HTTP de Base requies tout ce qui est après de Base "" pour être encodés en Base64, essayez donc de
request.Headers["Authorization"] = "Basic " +
Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo));
la solution à ma question était de changer la propriété ContentType . Si je change le type de contenu en
request.ContentType = "text/xml";
la requête fonctionne dans les deux cas, si je convertis aussi le authInfo en un Base64String dans le dernier exemple comme Anton Gogolev suggéré.
utilisant:
request.ContentType = "application/xml";
request.Credentials = new NetworkCredential(GEOSERVER_USER, GEOSERVER_PASSWD);
fonctionne aussi. La seconde définit les informations d'authentification.