未通过 HttpClient 请求发送的授权标头

Posted

技术标签:

【中文标题】未通过 HttpClient 请求发送的授权标头【英文标题】:Authorization Header not sent through an HttpClient request 【发布时间】:2020-04-28 13:03:53 【问题描述】:

上下文

我想在 Xamarin 应用程序中使用 HtppClient 使用基本身份验证进行简单的 API 调用。

问题

我已经做了一段时间没有问题,但是几天后,它似乎不再起作用了。无论我是否签出以前的提交。这个请求确实适用于 Postman ofc,所以我确定它来自我的代码,而不是 API。

我尝试同时针对 .Net Standard 2.0 或 2.1,无论我做什么,API 都会告诉我我缺少授权标头。我什至尝试在请求之前显示myClient.DefaultRequestHeaders.Authorization(授权存在且正确),在请求之后显示reponse.RequestMessage.Headers(缺少授权,存在其他标头)。

代码示例

这是我对客户端的初始化:

HttpClient _clientNewApi = new HttpClient();
string authDataNewApi = string.Format("0:1", username, password);
string authHeaderValueNewApi = Convert.ToBase64String(Encoding.UTF8.GetBytes(authDataNewApi));
_clientNewApi.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeaderValueNewApi);
_clientNewApi.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

这是发出请求的代码:

Uri uri = new Uri(recieved_uri);
// _clientNewApi.DefaultRequestHeaders.Authorization is well set
HttpResponseMessage json_response = await _clientNewApi.GetAsync(uri);
// json_response.RequestMessage.Headers does not contain Authorization Header
// json_response.StatusCode is Unauthorized, and the message sent back by the API is "No authentication credentials provided."

我一直在拼命查看我的代码并进行了数小时的结帐,但无济于事,任何线索都非常感谢:)

【问题讨论】:

为什么不安装 fiddler 之类的东西来检查网络请求。将其与邮递员进行比较,您应该会知道发生了什么。 我可以 100% 确定这样做,但我已经 99% 确定 HttpClient 发送的请求中缺少 Authorization 字段 根据使用 HttpClient 的经验,应该发送 Authorization 标头。因此,您需要使用 Fiddler 明确表明它不是 检查 json_response.RequestMessage.Headers.Authorization 你还有其他的api吗?尝试那里的身份验证,看看问题是否仍然存在。 【参考方案1】:

回复有点晚,但我的问题来自发送重定向代码 (3XX) 的 API。

邮递员没有说什么就进行重定向,这就是我从未见过的原因。

该代码也由 HttpClient 自动处理,但授权标头未传输到重定向请求(我猜是出于安全原因)。我必须禁用自动重定向才能自己处理并将标头传递给第二个请求。

【讨论】:

这是我遇到的确切问题。停止邮递员的自动重定向有助于调试我的问题!

以上是关于未通过 HttpClient 请求发送的授权标头的主要内容,如果未能解决你的问题,请参考以下文章

使用“application/x-www-form-urlencoded”内容类型请求标头时,未正确发送 HttpClient 后正文参数

使用 OPTIONS 方法未使用 http 请求 Angular 6 发送授权标头

授权标头未通过 Codeception API 测试

Ionic 2 / Angular 2 / CORS:HTTP 标头未随请求一起发送

获取请求未通过授权标头[关闭]

Swift:未设置请求授权标头