簡體   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