c#网络凭据没有传递给服务器

本文关键字:服务器 网络 | 更新日期: 2023-09-27 18:05:55

Edit: Using:

byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(user + ":" + password);
wr.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);

似乎工作得很好。

我有一个与CMS通信的应用程序。我目前正试图让这个客户端能够使用"POST"方法将文本/xml数据上传到CMS。

我可以用旋度很好地传递这个

curl -u user:password -H "Content-Type:text/xml" -d "<element>myXML</element>" serverURL

然而,试图在c#中使用HttpWebRequest,我无法让服务器返回我想要的东西。所以我启动了Wireshark,看看实际传递了什么,除了使用curl我可以看到:

之外,它几乎是一样的。
Authorization: Basic <a bunch of hex>='r'n
Credentials: user:password

在HTTP报头字段中,而在我的客户端的输出中,这些报头字段根本不存在。("凭据:"实际上不是纯文本,它是"授权:"的子树-所以我不确定它是从哪里得到的,但用户名和密码是正确的。)

我试图使用c#代码来设置webrequest的凭据是这样的:

NetworkCredential myCred = new NetworkCredential(
                    user, password, serverURL);
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(serverURL), "Basic", myCred);
HttpWebRequest wr = (HttpWebRequest) HttpWebRequest.Create(serverURL);
wr.Credentials = myCache;

我也试过这样设置凭据(不指定serverURL):

wr.Credentials = new NetworkCredential(user,password,serverURL);

但这仍然不能使它显示在wireshark中。有人知道吗?

A)授权信息实际上应该在HTTP报头中才能工作,并且

B)如果是-那么我如何使c#把它放进去?我似乎只能找到使用默认凭证的像样的例子,这并不适用于我正在做的事情。

c#网络凭据没有传递给服务器

。. NET的WebRequest有一个令人恼火的默认行为,它只在收到HTTP 401 Not Authorized响应后才发送凭据。

手动添加凭证头(就像你所做的那样)似乎是最好的解决方案。

更多的细节在这篇文章