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.

10
demandé sur taudorf 2011-03-01 12:39:49

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));
12
répondu Anton Gogolev 2011-03-01 11:08:36

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é.

9
répondu taudorf 2011-03-03 09:50:26

utilisant:

request.ContentType = "application/xml";

request.Credentials = new NetworkCredential(GEOSERVER_USER, GEOSERVER_PASSWD);

fonctionne aussi. La seconde définit les informations d'authentification.

1
répondu okello 2012-06-21 12:51:16