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

标签 c# httpclient basic-authentication unauthorized www-authenticate

我想通过 HttpClient 向外部 API 发送请求来自我自己的 C# 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);从我的请求 header 中删除了授权 header ,我收到了 UnAuthorized http 错误。
我知道发生重定向时,出于安全原因删除了授权 header 。此外,我不确定外部 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": "Method "GET" not allowed."}


外部 API 方法是 PUT .但在这里我得到了 GET错误。
我在 postman 中尝试了很多选项,最后我在 postman 中找到了选项:
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"在响应头中。
究竟是什么?我该怎么办?

最佳答案

您在重定向后删除授权 header 是正确的。但请记住,这种行为是 HttpClient 设计的一部分。在 C# 中。 Postman 和 Insomnia 可能有不同的机制来发送由重定向引起的每个连续请求的授权 header 。您在 Postman 中启用的选项将使它使用您指定的原始 HTTP 方法( PUT )作为 HTTP 方法,以根据重定向消息发送进一步的请求( postman 默认使用 GET 方法处理重定向消息指示的请求)。
您看到 301 的事实表明需要重定向。您可以查看 Location response.Headers 中的 header 值查看真实位置并将带有授权 header 的请求直接发送到该端点。如果我是你,我不会直接使用新位置,因为原始端点是 API 的作者给你的。相反,我会以编程方式将请求发送到原始端点,并将对 301 代码的请求重新发送到新的 Location (由于 Postman 的行为,使用 PUT 方法)直到您得到结果。这个答案可以给你一些想法:https://stackoverflow.com/a/42566541/1539231

关于发送到服务器后删除 C# HttpClient 授权 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68367640/

相关文章:

c# - 等待空合并运算符抛出的异常

c# - 读取其他进程控制台输出

c# - 将秒的 float 转换为分秒的 float

java - HttpGet 中的 android java.lang.IllegalArgumentException

java - 在达到超时之前关闭 HttpClient 连接

java - 通过示例进行 DropWizard 身份验证

c# - asp.net中通过javascript获取控件Id

httpclient - 如何设置具有基本授权的 Windows.Web.Http.HttpClient PostAsync++

c# - 读取 HTTP 认证中的 Realm 属性

java - 通过 HttpClient 连接 Tomcat 管理器