PreAuthenticate 应该发送身份验证标头。
services.AddHttpClient<TrackAndTraceClient>()
.ConfigureHttpClient(httpClient =>
{
httpClient.BaseAddress = new Uri(settings.BaseUrl);
httpClient.Timeout = TimeSpan.FromMinutes(5);
})
.ConfigurePrimaryHttpMessageHandler(serviceProvider =>
{
return new HttpClientHandler()
{
PreAuthenticate = true,
Credentials = new NetworkCredential(settings.Username,
settings.Password)
};
});
如果这不起作用,可能是由于HttpClientHandler 类中的Credentials 属性具有[UnsupportedOSPlatform("browser")] 属性(从.NET 5 开始)——注意PreAuthenticate 属性也是如此。此外,HttpClientHandler 类还包含如下定义:
.NET Framework 和 .NET Core 2.0 及更早版本中 HttpClient 使用的默认消息处理程序。
我看到你的帖子有标签.NET 6,所以这也可能是导致它没有发送的一个因素。如果我是你,我会使用中间件从请求中接收身份验证标头,并使用 @Burhan Savci 发布的解决方案发送它。
假设您的后端是类似的 .NET Core API:
public class BasicAuthMiddleware
{
private readonly RequestDelegate _next;
public BasicAuthMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
string authHeader =
httpContext.Request.Headers["Authorization"];
if (authHeader != null)
{
string auth = authHeader.Split(new char[] { ' ' })[1];
Encoding encoding = Encoding.GetEncoding("UTF-8");
var usernameAndPassword =
encoding.GetString(Convert.FromBase64String(auth));
string username = usernameAndPassword
.Split(new char[] { ':' })[0];
string password = usernameAndPassword
.Split(new char[] { ':' })[1];
if (username == "abc" && password == "123")
{
await _next(httpContext);
}
else
{
httpContext.Response.StatusCode = 401;
return;
}
}
else
{
httpContext.Response.StatusCode = 401;
return;
}
}
}
然后在你的 Startup 类的 configure 方法中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<BasicAuthMiddleware>();
}