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

Ali*_*our 6 c# httpclient unauthorized basic-authentication www-authenticate

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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

我将HttpClientHandlerwith添加AllowAutoRedirect = false到我的HttpClient

var handler = new HttpClientHandler()
{
    AllowAutoRedirect = false,
};
var client = new HttpClient (handler)
{
    BaseAddress = new Uri(baseUrl)
};
Run Code Online (Sandbox Code Playgroud)

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

我决定在 Postman 中测试代码。默认情况下,当我在 Postman 中调用 API 时,出现 http 错误 405 method not allowed 和如下错误详细信息:

{“detail”:“不允许方法“GET”。”}

外部API方法是PUT. 但这里我得到了GET错误。我在邮递员中尝试了很多选项,最后在邮递员中找到了该选项: 遵循原来的http方法

当我打开它时,外部 API 工作正常。我也对其进行了测试Insomnia,它工作正常。

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

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

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

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

我将不胜感激您的答复。

更新

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

Ali*_*our 10

我找出问题所在了。实在是太可笑了。当我使用 URL 之类的www.abc.com/api/something请求时,会收到 301 错误,并且邮递员会发送另一个请求,例如www.abc.com/api/something/. 区别就/在于请求的末尾。我在邮递员中尝试了新的 URL,第一个请求正常。我还在我的 C# 代码中尝试了 URL,再次确定。但我不明白为什么。

非常感谢亲爱的@pharaz-fadaei