繁体   English   中英

C# HttpClient cannot send authorization header to ASP.NET Core Web API

[英]C# HttpClient cannot send authorization header to ASP.NET Core Web API

我正在尝试使用 ASP.NET MVC 中的 C# HttpClient 向 API 发出请求。 我的 API 在 .NET 6.0 上运行。

httpClient.BaseAddress = new Uri(_url);
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue($"Bearer", $"{token}");
var serialized = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
var httpResponseMessage = await httpClient.PutAsync(urlToSend, serialized);

这是我的代码。 我尝试了我在谷歌上看到的所有可能性。 但是在发送请求时,我无法发送授权 header。

我可以用 Postman 发送。

这是我的 API 代码:

    [Consumes("application/json")]
    [Produces("application/json", "text/plain")]
    [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IResult))]
    [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(IResult))]
    [HttpPut("changeuserpassword")]
    public async Task<IActionResult> ChangeUserPassword([FromBody] ChangePasswordCommand changePasswordCommand)
    {
        var accessToken = Request.Headers[HeaderNames.Authorization];
        return GetResponseOnlyResult(await Mediator.Send(changePasswordCommand));
    }

注意:在我的 _url 中,我使用 http,而不是 https。

我不确定,但也许[AllowAnonymous]属性从请求中删除了 Authorization header 只是因为如果不需要授权就没有意义。 您是否使用 fiddler 之类的工具检查了发送的请求是否包含 header?

请查看此链接。 Allow Anonymous 将忽略身份验证 header

https://github.com/dotnet/aspnetcore/issues/30546

我尝试了代码。 对我来说似乎工作正常。 这是我的控制台应用程序代码

try
            {

                ChangePasswordCommand passobj = new ChangePasswordCommand() { password = "new password"};

                string _url = "https://localhost:44395/api/Values/";

                var httpClient = new HttpClient();
                httpClient.BaseAddress = new Uri(_url);
                httpClient.DefaultRequestHeaders.Clear();
                httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue($"Bearer", $"MYTOKEN");
                var serialized = new StringContent(JsonConvert.SerializeObject(passobj), Encoding.UTF8, "application/json");
                var httpResponseMessage = await httpClient.PutAsync("changeuserpassword", serialized);
            }
            catch (Exception ex) { 
            
            }

这是控制器 Api

[允许匿名]

    [Consumes("application/json")]
    [Produces("application/json", "text/plain")]
    
    [HttpPut("changeuserpassword")]
    public async Task<IActionResult> ChangeUserPassword(ChangePasswordCommand changePasswordCommand)
    {
        var accessToken = Request.Headers[HeaderNames.Authorization];

        return Ok();
    }

我通过将我的基础 url 从 HTTP 更改为 HTTPS 解决了这个问题。

我尝试使用 Fiddler,当我向 HTTP 请求时遇到了同样的问题。

感谢@olivier-duhart。

为了增加已接受的答案,通过从 HTTP 更改为 HTTPS 来解决问题是因为授权 header 在重定向期间被剥夺。 此行为是出于安全考虑,并且是设计使然,如github讨论中所述。

例如,在使用 Postman 与 HttpClient 时可能不会看到相同的行为,这是由于不同的客户端具有不同的机制,通过这些机制处理对重定向位置的后续请求(响应状态为 30X 之后)。

在stackoverflow的其他地方也是一个很好的答案: Authorization header is lost on redirect

暂无
暂无

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

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