Похоже, что HTTP/2 не работает с аутентификацией, предоставляемой Http.Sys в asp.net

#c# #asp.net #http #http2 #http.sys

Вопрос:

Представьте, что у меня есть две службы в одном домене : https://example.com:5001 и https://example.com:5002

https://example.com:5001 имеет http.sys такие настройки

 .UseHttpSys(options =>
{
  options.Authentication.Schemes =
  AuthenticationSchemes.NTLM |
  AuthenticationSchemes.Negotiate;
  options.Authentication.AllowAnonymous = false;
  options.UrlPrefixes.Add("https://example.com:5001");
});
 

И https://example.com:5002 есть ли у этого варианта:

 .UseHttpSys(options =>
{
  options.AllowSynchronousIO = false;
  options.EnableResponseCaching = false;
  options.UrlPrefixes.Add("https://example.com:5002");
})
 

Когда я отправляю запрос в первую службу, я получаю разные проблемы:

  1. Через HttpClient -> WinHttpHandler>:
 var handler = new WinHttpHandler()
{
  SslProtocols = SslProtocols.Tls12,
  ServerCredentials = CredentialCache.DefaultCredentials
};
           
var httpClient = new HttpClient(handler)
{
  DefaultRequestVersion = HttpVersion.Version20,
};

var response = httpClient.GetAsync("https://example.com:5001").Resu<
 

Ответ имеет код состояния 200, но версия протокола понижена до 1.1

  1. Через HttpClient -> HttpClientHandler>:
 var handler = new HttpClientHandler()
{
  SslProtocols = SslProtocols.Tls12,
  Credentials = CredentialCache.DefaultCredentials
};
           
var httpClient = new HttpClient(handler)
{
  DefaultRequestVersion = HttpVersion.Version20,
};

var response = httpClient.GetAsync("https://example.com:5001").Resu<
 

Ответ имеет код состояния 401, Несанкционированный и версию протокола 2.0

  1. Через HttpWebRequest:
 var webRequest = (HttpWebRequest)WebRequest.Create("https://example.com:5001");
webRequest.Credentials = CredentialCache.DefaultCredentials;
webRequest.Method = WebRequestMethods.Http.Get;
webRequest.ProtocolVersion = HttpVersion.Version20;
 

Создает исключение : В настоящее время поддерживаются только запросы версий HTTP/1.0 и HTTP/1.1. (Параметр «значение»)

Все же просит, чтобы https://example.com:5002 имеют код статуса 200 и версию протокола HTTP/2

Я полагаю, что аутентификация не работает должным образом с HTTP/2 в http.sys, или я делаю что-то не так.

Есть идеи, как это может работать правильно? Заранее благодарю вас!

Ответ №1:

Я обнаружил, что http/2 не поддерживает проверку подлинности Windows. Более подробная информация здесь: https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/http2-on-iis#when-is-http2-not-supported