繁体   English   中英

HttpClient 未在 .Net Core 3.1 中发送授权承载令牌

[英]HttpClient not sending authorization Bearer token in .Net Core 3.1

我有一个 ASP.NET Core MVC 应用程序,它使用 HttpClient 调用 ASP.NET Core WebApi,但我必须发送授权标头,问题是我的 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 标头,我尝试实例化一个新的 HttClient,使用 HttpRequestMessage 然后 SendAsync,但它从来没有工作,我也尝试过使用httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}"); 但它不起作用,也TryAddWithoutValidation ,但不起作用。 最糟糕的是,当我检查我的 httpClient 对象时,授权令牌在那里:

在此处输入图片说明

但是后来我从我的 webapi 收到一条 401 消息,当我检查在 webapi 中收到的请求时,授权标头是空的,当它收到来自 ajax 调用或 insomnia 和 postman 等应用程序的请求时,我的 webapi 工作正常。

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

编辑:

在我的 webapi 中,到达的请求是: 在此处输入图片说明

我的授权标头是 {}

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

在此处输入图片说明

您使用的代码看起来应该可以工作,我尝试了类似的方法,并按预期添加了 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 作为不记名令牌添加到标头中(否则将无法正常工作)

希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM