Использование https с зависанием быстрого запуска IdentityServer4

#https #asp.net-core #identityserver4

#https #asp.net-ядро #identityserver4

Вопрос:

Я пытаюсь изучить IdentityServer4, поэтому я начал с документации здесь https://identityserver4.readthedocs.io/en/dev/quickstarts/0_overview.html и закончилось это так https://identityserver4.readthedocs.io/en/dev/quickstarts/1_client_credentials.html .

Все работает отлично, пока я использую http, но как только я переключаюсь на использование https, самая первая строка кода в клиентском тестере

 var disco = await DiscoveryClient.GetAsync("https://localhost:44384");
  

зависает и в конечном итоге получает исключение отмены задачи.

Если я просто переключу все обратно на http, он снова начнет работать.

В фактическом решении IdentityServer я изменил applicationUrl и launchUrl в launchSettings.json:

 {
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "https://localhost:44384/",
      "sslPort": 44384
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Mvcg.IdentityServer": {
      "commandName": "Project",
      "launchUrl": "https://localhost:44384",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
  

И .UseUrls в Program.cs

 public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseUrls("https://localhost:44384")
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}
  

В клиентском решении, как отмечалось выше, я изменил код, вызывающий конечную точку обнаружения, на использование https вместо http

 var disco = await DiscoveryClient.GetAsync("https://localhost:44384");
  

Чтобы было ясно, простое изменение всех отмеченных элементов между http и https работает для http, но не для https. Между моими двумя тестами больше ничего не меняется.

Есть ли что-то, чего мне не хватает, из-за чего https не работает?

Комментарии:

1. Что происходит при доступе к сайту и документу обнаружения в браузере? любой asp.net журналы, которые дают вам подсказку (увеличьте уровень журнала для отслеживания)

2. После запуска решения в Visual Studio я перешел на localhost: 44384/.well-known/OpenID-configuration в моем браузере, и там просто написано: «Этот сайт недоступен. localhost слишком долго отвечал «. Инструменты разработчика показывают ERR_TIMED_OUT. Интересно, что я скачал образцы с github.com/IdentityServer/IdentityServer4.Samples и попробовал тот же тест. Я переключился с http на https, и произошло то же самое. Я загляну в журналы, чтобы узнать, есть ли там какая-либо помощь.

Ответ №1:

Похоже, проблема связана с консольным хостингом. Пока я запускаю хост IdentityServer в IIS Express, все работает нормально. Каждый раз, когда я пытаюсь переключить его на консольный хостинг, он терпит неудачу. Ошибка, отображаемая в консоли хостинга:

 info: Microsoft.AspNetCore.Server.Kestrel[17]
      Connection id "0HKVQ4SEO0GOI" bad request data: "The input string contains non-ASCII or null characters."
Microsoft.AspNetCore.Server.Kestrel.BadHttpRequestException: The input string contains non-ASCII or null characters.
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure.MemoryPoolIteratorExtensions.GetAsciiString(MemoryPoolIterator start, MemoryPoolIterator end)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.TakeStartLine(SocketInput input)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext()
warn: Microsoft.AspNetCore.Server.Kestrel[0]
      Connection processing ended abnormally
Microsoft.AspNetCore.Server.Kestrel.BadHttpRequestException: The input string contains non-ASCII or null characters.
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure.MemoryPoolIteratorExtensions.GetAsciiString(MemoryPoolIterator start, MemoryPoolIterator end)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.TakeStartLine(SocketInput input)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext()
  

Не уверен точно, как исправить эту ошибку, поэтому сейчас мне просто нужно будет разместить в IIS Express, чтобы продолжать двигаться вперед.

Комментарии:

1. И ответ на проблему заключается в том, что IIS Express использует сертификат разработки для https, тогда как Kestrel этого не делает. Если вы хотите использовать консольный хостинг с https, вам нужен сертификат. github.com/aspnet/KestrelHttpServer/blob/dev/samples/SampleApp /…