发送到服务器后删除 C# HttpClient 授权标头

问题描述

我想通过 HttpClient 从我自己的 C# API 向外部 API 发送请求。 我正在使用 dot net 5 和基本身份验证。 这是我的代码

var client = new HttpClient 
{
    BaseAddress = new Uri(baseUrl)
};

HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Put,"apiUrl");

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var param = JsonConvert.SerializeObject(new
{
   param1="",param2=""
});

requestMessage.Content = new StringContent(param,Encoding.UTF8,"application/json");
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(Encoding.ASCII.GetBytes($"{user}:{pass}")));

HttpResponseMessage response = await client.SendAsync(requestMessage);

通常,我会像这样发送 http 请求。 但现在我遇到了一些问题。

在从我的请求标头中删除HttpResponseMessage response = await client.SendAsync(requestMessage); 行授权标头后,我收到了 UnAuthorized http 错误

我知道发生重定向时,出于安全原因删除了授权标头。另外我不确定外部 API 中的重定向

我将带有 httpclienthandlerAllowAutoRedirect = false 添加到我的 HttpClient

var handler = new httpclienthandler()
{
    AllowAutoRedirect = false,};
var client = new HttpClient (handler)
{
    BaseAddress = new Uri(baseUrl)
};

现在我收到重定向错误 301(永久移动)。

我决定在 Postman 中测试代码认情况下,当我在 Postman 中调用 API 时,我收到了 http 错误 405 方法不允许和错误详细信息如下:

{ "detail": "不允许方法 "GET"。"}

外部 API 方法PUT。但在这里我遇到了 GET 错误。 我在邮递员中尝试了很多选项,最后我在邮递员中找到了选项:

Follow original http method

当我打开它时,外部 API 工作正常。 我还使用 Insomnia 对其进行了测试,并且可以正常工作。

它是否与我的代码或 dot net 5 或我的代码中的其他内容有关,或者与外部 API 相关?

如果它与我的代码有关,我该如何解决错误

如果错误与外部 API 相关,为什么 Postman 和 Insomnia 响应正常?

外部 API 具有针对特定域的核心策略,我从其他域发送请求。 我所知道的是在浏览器中应用的 CORS 策略。不在 Postman、Insomnia 或 C# 代码中。 CORS 呢?它与CORS有关吗?如果是,我该怎么办?

非常感谢您的回答。

更新

我在响应标头中检测到 WWW-Authenticate: JWT realm="api"。 究竟是什么?我该怎么办?

解决方法

由于您看到 WWW-Authenticate: JWT realm="api" 标头,因此外部 API 需要 JWT 令牌身份验证,而不是基本身份验证。我认为首先您可能需要检查外部 api 的文档。

,

您在重定向后删除授权标头是正确的。但请记住,此行为是 C# 中 HttpClient 设计的一部分。 Postman 和 Insomnia 可能有不同的机制来发送由重定向引起的每个连续请求的授权标头。您在 Postman 中启用的选项将使其使用您指定的原始 HTTP 方法 (PUT) 作为 HTTP 方法根据重定向消息发送进一步的请求(邮递员使用 GET 方法默认情况下,重定向消息指示的请求)。

您看到 301 的事实表明需要重定向。您可以检查 Location 中的 response.Headers 标头值以查看真实位置并将带有授权标头的请求直接发送到该端点。如果我是你,我不会直接使用新位置,因为原始端点是 API 的作者给你的。相反,我会以编程方式将请求发送到原始端点,然后将 301 代码上的请求重新发送到新的 Location(由于 Postman 的行为而使用 PUT 方法),直到您得到结果。这个答案可以给你一些想法:https://stackoverflow.com/a/42566541/1539231

,

我发现了问题。这真的很荒谬。 当我使用像 www.abc.com/api/something 这样的 URL 时,请求会收到 301 错误,邮递员会发送另一个像 www.abc.com/api/something/ 这样的请求。区别只是在请求结束时 /。 我在邮递员中尝试了新的 URL,第一个请求没问题。 另外我在我的 C# 代码中尝试了 URL,再次确定。 但我不明白为什么。

非常感谢亲爱的@pharaz-fadaei