c# - 在 C# 中使用用户身份验证的 cURL

标签 c# .net 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

我试过使用 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();
...

但我得到一个错误:(400) 错误的请求。

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

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();
...

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

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

如有任何意见或指导,我们将不胜感激。

最佳答案

HTTP Basic 身份验证要求 “Basic” 之后的所有内容都进行 Base64 编码,因此请尝试

request.Headers["Authorization"] = "Basic " + 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo));

关于c# - 在 C# 中使用用户身份验证的 cURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5152723/

相关文章:

facebook - FB.login 对话框不会在 Google Chrome 上关闭

reactjs - 使用NextJS和Auth0时如何添加共享布局?

c# - LINQ:一起使用 AssociateWith 和 Distinct

.NET:从串口读取数据

c# - 基于多级角色授权的数据库设计

c# - 自定义 RoleProvider 和无法加载类型

c# - 在 .NET Framework 中获取国家代码

wcf - 如何为具有 HTTPS 终结点的 WCF 服务生成客户端代理?

c# - 私有(private)类是否需要通过属性访问?

c# - 逐步更新 ASP.NET MVC 中的模型