【问题标题】:HttpClient not sending authorization Bearer token in .Net Core 3.1HttpClient未在.Net Core 3.1中发送授权承载令牌
【发布时间】:2023-04-01 07:00:01
【问题描述】:

我有一个使用 HttpClient 调用 ASP.NET Core WebApi 的 ASP.NET Core MVC 应用程序,但我必须发送授权标头,问题是我的 HttpClient 不会发送授权标头。

我有一个用于调用具有以下构造函数的 webapi 的服务:

        public ApiService(HttpClient httpClient, IHttpContextAccessor accessor)
        {
            string token = accessor.HttpContext.User.FindFirstValue("JWToken"); // gets user token
            httpClient.BaseAddress = new Uri(AppSettings.BaseUrlApi); //sets the base URL of the webapi
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            httpClient.Timeout = TimeSpan.FromMinutes(1);
            httpClient.DefaultRequestHeaders.Authorization
                         = new AuthenticationHeaderValue("Bearer", token);

            _httpClient = httpClient; // assigns to a private property "private readonly HttpClient _httpClient;"
        }

然后,当我将数据发布到 webapi 时,我使用以下方法:

        public async Task<User> PostAsync(string url, User user)
        {
            StringContent jsonContent = new StringContent(
                JsonConvert.SerializeObject(user, Formatting.Indented, _jsonSettings), // _jsonSettings is a JsonSerializerSettings object
                Encoding.UTF8,
                "application/json");

            using HttpResponseMessage httpResponse =
                await _httpClient.PostAsync(url, jsonContent);
            httpResponse.EnsureSuccessStatusCode();
            string responseString = await httpResponse.Content.ReadAsStringAsync();

            return JsonConvert.DeserializeObject<User>(responseString, _jsonSettings);
        }

对于不需要 Authorization 标头的请求,它工作得很好,但它不发送 Authorization 标头,我尝试使用 HttpRequestMessage 然后 SendAsync 实例化一个新的 HttClient,但它从来没有工作,我也尝试过使用httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}"); 但它不起作用,也使用TryAddWithoutValidation,但不起作用。 最糟糕的是,当我检查我的 httpClient 对象时,授权令牌就在那里:

然后我从我的 webapi 收到一条 401 消息,当我检查在 webapi 中收到的请求时,授权标头为空,并且我的 webapi 在收到来自 ajax 调用或诸如 insomnia 和 postman 之类的应用程序的请求时工作正常.

我无法弄清楚我错过了什么。

编辑:

在我的 webapi 中,到达的请求是:

我的授权标头是 {}

现在,例如,当我收到来自 insomnia 的请求时,我有以下标头:

【问题讨论】:

标签: c# asp.net asp.net-web-api


【解决方案1】:

您使用的代码看起来应该可以工作,我尝试了类似的方法,它按预期添加了 JWT。 401 是否有可能合法地指代错误的令牌?我会尝试使用:https://jwt.io/ 对其进行解码,并验证其中的所有声明是否有意义(例如过期)并且签名正确。

更新

添加一些与您尝试执行的代码非常相似的代码,这对我有用,仅供参考,这是通过 API 拨打电话,为简单起见将 JWT 生成和命令生成排除在外

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

var json = JsonConvert.SerializeObject(command,
    Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
httpClient.DefaultRequestHeaders.Authorization = 
    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", jwt);

var content = new StringContent(json, Encoding.UTF8, "application/json");

var response = httpClient.PostAsync("https://api.nexmo.com/v1/calls", content).Result;

我可以确认这肯定会将 JWT 作为不记名令牌添加到标头中(否则将无法正常工作)

希望这会有所帮助。

【讨论】:

  • 感谢您的回复。我检查了 jwt 令牌,它是有效的,过期很好,一旦我提供了秘密令牌,它说签名验证。我添加了从我的 httpclient(asp.net 核心)和 insomnia 收到的请求的图片。
  • @AlefDuarte 我添加了一个更新,其中包含我使用的确切代码(这与你的非常相似 - 这肯定是将 JWT 添加为不记名令牌
  • 我仍然遇到同样的问题,但是由于您的代码应该可以工作,现在我知道它一定是我忽略的一些配置,而不是 httpclient 的实例化方式。感谢您的帮助,如果我有任何更新,我会通知您。
猜你喜欢
  • 2016-10-31
  • 2020-09-17
  • 2021-03-07
  • 1970-01-01
  • 2020-04-28
  • 2018-07-04
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
相关资源
最近更新 更多