在HTTP.sys上使用Windows身份验证时如何避免多个401



我有一个使用 .NET core 2.2 和 HTTP.Sys 的 Web API。我已经设置了 Windows 身份验证,当用户获得授权时,我可以看到 401 WWW-Negotiate 质询,然后是 200。

现在我已经多次执行相同的请求,但我看到每个请求都在发生挑战,从而减慢了系统速度并影响了性能。 我的示例客户端:

var httpHandler = new HttpClientHandler
{
UseDefaultCredentials = true,
Proxy = new WebProxy
{
Address = new Uri("http://HOSTNAME:8888"),
}
};
using (var client = new HttpClient(httpHandler))
{
client.BaseAddress = new Uri("http://HOSTNAME:5000/");
for (int i = 0; i < 10; i++)
{
try
{
HttpResponseMessage response = client.GetAsync("api/user").Result;
response.EnsureSuccessStatusCode();
string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine("Result: " + result);
}
catch (System.Exception ex)
{
Console.WriteLine(ex);
}
}

我读到对于 IIS,似乎您可以在此处使用authPersistNonNTLM=true,但我无法为纯 HTTP.sys 进行类似的设置。 知道吗?

谢谢

我在HttpSysOptions类中没有看到任何类似的选项(您传递给HTTP的选项.sys(。

可能会有所帮助的是不要处理您的HttpClient(不要在其上使用using(。HttpClient是线程安全的,旨在重复使用。事实上,你应该保留对它的static引用并重用它。这里有一个冗长的讨论,但简而言之:如果你不这样做,它就不会重用连接。

这可能与您为什么看到这个有关。但是,如果这不能解决问题,请监视流量,并查看客户端是否在第一个请求时发送身份验证详细信息。它们应该是,因为您设置了UseDefaultCredentials,但如果没有,那就是您的问题。

更新:您也可以尝试在HttpClientHandler上设置PreAuthenticate属性:

var httpHandler = new HttpClientHandler
{
UseDefaultCredentials = true,
PreAuthenticate = true,
Proxy = new WebProxy
{
Address = new Uri("http://HOSTNAME:8888"),
}
};

根据文档,在第一次成功进行身份验证后,它将向相同的主机发送所有后续请求的凭据,而无需等待 401 质询。

相关内容

  • 没有找到相关文章

最新更新