[英]Using C# HttpClient, how to POST a string HttpContent 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.