未发送 HttpClient 身份验证标头
本文关键字:身份验证 HttpClient | 更新日期: 2023-09-27 18:30:36
我正在尝试为需要基本HTTP身份验证的第三方服务使用HttpClient
。我正在使用AuthenticationHeaderValue
.以下是我
HttpRequestMessage<RequestType> request =
new HttpRequestMessage<RequestType>(
new RequestType("third-party-vendor-action"),
MediaTypeHeaderValue.Parse("application/xml"));
request.Headers.Authorization = new AuthenticationHeaderValue(
"Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "username", "password"))));
var task = client.PostAsync(Uri, request.Content);
ResponseType response = task.ContinueWith(
t =>
{
return t.Result.Content.ReadAsAsync<ResponseType>();
}).Unwrap().Result;
看起来 POST 操作工作正常,但我没有得到我期望的数据。通过一些反复试验,并最终使用 Fiddler 嗅探原始流量,我发现授权标头没有被发送。
我已经看到了这一点,但我想我已经将身份验证方案指定为 AuthenticationHeaderValue
构造函数的一部分。
我错过了什么吗?
您的代码看起来应该可以工作 - 我记得在设置授权标头时遇到了类似的问题,并通过执行 Headers.Add() 而不是设置它来解决:
request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "username", "password"))));
更新:它看起来像当您执行请求时。内容,并非所有标头都反映在内容对象中。 您可以通过检查请求来查看这一点。标头与请求。您可能想尝试的一件事是使用 SendAsync 而不是 PostAsync。 例如:
HttpRequestMessage<RequestType> request =
new HttpRequestMessage<RequestType>(
new RequestType("third-party-vendor-action"),
MediaTypeHeaderValue.Parse("application/xml"));
request.Headers.Authorization =
new AuthenticationHeaderValue(
"Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "username", "password"))));
request.Method = HttpMethod.Post;
request.RequestUri = Uri;
var task = client.SendAsync(request);
ResponseType response = task.ContinueWith(
t =>
{ return t.Result.Content.ReadAsAsync<ResponseType>(); })
.Unwrap().Result;
这也行得通,您不必处理 base64 字符串转换:
var handler = new HttpClientHandler();
handler.Credentials = new System.Net.NetworkCredential("username", "password");
var client = new HttpClient(handler);
...
尝试在客户端上设置标头:
DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", userName, password))));
这对我有用。
实际上你的问题出在PostAsync
- 你应该使用 SendAsync
.在代码中 - client.PostAsync(Uri, request.Content);
仅发送请求消息标头不包含的内容。正确的方法是:
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = content
};
message.Headers.Authorization = new AuthenticationHeaderValue("Basic", credentials);
httpClient.SendAsync(message);
另外,请考虑重定向处理程序将清除授权标头,如果您的请求被重定向.
因此,如果您调用 HTTP 端点并将其重定向到 HTTPS 端点,您将丢失授权标头。
request.Headers.Authorization = null;
框架:.NET v6.0