У меня есть приложение ASP.Net Core, настроенное для выдачи и аутентификации токенов-носителей JWT. Клиенты могут успешно извлекать токены на предъявителя и аутентифицироваться с помощью токена, когда сайт размещен в Kestrel.Как настроить ASP.Net TestHost для работы с OpenId Connect?
У меня также есть набор интеграционных тестов, в которых используется Microsoft.AspNetCore.TestHost.TestServer. Перед добавлением проверки подлинности тесты смогли успешно выполнить запросы к приложению. После добавления аутентификации я начал получать ошибки, связанные с доступом к конфигурации открытого идентификатора. Конкретное исключение я вижу это:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://
fail: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[3]
Exception occurred while processing message.
System.InvalidOperationException: IDX10803: Unable to obtain configuration from: 'http://localhost/.well-known/openid-configuration'. ---> System.IO.IOException: IDX10804: Unable to retrieve document from: 'http://localhost/.well-known/openid-configuration'. ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 404 (Not Found).
На основании своих исследований, это иногда срабатывает, когда орган установлен на другой хост, чем хостинг-сервер. Например, Kestrel работает по умолчанию по умолчанию http://localhost:5000, и это то, на что я установил свой авторитет сначала, но при настройке на то, что эмулятор TestServer (http://localhost), он по-прежнему дает ту же ошибку. Вот моя конфигурация аутентификации:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
RequireHttpsMetadata = false,
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
ValidateAudience = true
},
Audience = "Anything",
Authority = "http://localhost"
});
Что нечетное является то, что пытается ударить URL непосредственно из теста Integration работает отлично:
Так как же настроить ASP.Net TestServer и инфраструктуру OpenId Connect для совместной работы?
=== EDIT ====
Размышляя об этом немного, мне пришло в голову, что проблема в том, что внутренние авторизации JWT пытается сделать запрос на http://localhost порт 80, но это ISN Не пытайтесь сделать запрос с помощью TestServer и поэтому ищете настоящий сервер. Поскольку его нет, он никогда не будет аутентифицироваться. Похоже, следующий шаг - посмотреть, есть ли способ отключить проверку полномочий или каким-то образом расширить инфраструктуру, чтобы позволить ему использовать TestServer в качестве хоста.
Ваши правильные изменения. Вы пытались предоставить конфигурацию в своих тестах, которая не устанавливает полномочия? Технически, все ваши тесты должны нуждаться в аутентифицированном Пользователе, который вы можете импровизировать/издеваться - без необходимости использовать аутентификацию JWT вообще. – Brad
Я считаю, что я пытался не устанавливать полномочия, но, похоже, я помню, что он выдавал ошибку. Я закончил поиск решения и отправлю ответ. –