![](/img/trans.png)
[英]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.