C#中使用C#进行用户身份验证

tau*_*orf 11 .net c# authentication curl geoserver

我想在c#中执行以下cURL请求:

curl -u admin:geoserver -v -XPOST -H 'Content-type: text/xml' \
   -d '<workspace><name>acme</name></workspace>' \
   http://localhost:8080/geoserver/rest/workspaces
Run Code Online (Sandbox Code Playgroud)

我尝试过使用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();
...
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:(400)请求不好.

如果我更改请求凭据并在标头中添加身份验证:

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();
...
Run Code Online (Sandbox Code Playgroud)

然后我得到:(401)未经授权.

我的问题是:我应该使用另一个C#类,如WebClient或HttpWebRequest,还是必须使用.NET的curl绑定?

所有评论或指导将不胜感激.

Ant*_*lev 12

HTTP基本身份验证要求"基本"之后的所有内容都是Base64编码的,所以请尝试

request.Headers["Authorization"] = "Basic " + 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo));
Run Code Online (Sandbox Code Playgroud)


tau*_*orf 9

我的问题的解决方案是更改ContentType属性.如果我将ContentType更改为

request.ContentType = "text/xml";
Run Code Online (Sandbox Code Playgroud)

如果我在最后一个例子中将authInfo转换为Base64String,就像Anton Gogolev建议的那样,请求在这两种情况下都有效.