#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 /…