Мы пытаемся поддерживать несколько схем аутентификации. Это работает в нетестовом коде, но не работает в наших интеграционных тестах.
В наших интеграционных тестах мы не можем использовать правильную схему аутентификации для данного теста. Некоторые тесты проверяют нашу NTLM-аутентификацию, а другие тестируют нашу аутентификацию на предъявителя. Мы можем выполнить либо аутентификацию NTLM, либо аутентификацию носителя, но наш код не может правильно выбрать, какую схему аутентификации использовать из нашего тестового запроса.
В коде запуска нашего приложения у нас настроена аутентификация носителя JWT для Okta:
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", opt =>
{
opt.Audience = Configuration.GetValue<string>("Okta:Audience");
opt.Authority = issuer;
opt.TokenValidationParameters = validationParameters;
opt.BackchannelHttpHandler = new UserAgentHandler("okta-aspnetcore",
typeof(OktaAuthenticationOptionsExtensions).Assembly.GetName().Version);
opt.SecurityTokenValidators.Clear();
opt.SecurityTokenValidators.Add(new StrictSecurityTokenValidator());
});
В нашем интеграционном тесте WebApplicationFactory у нас есть обработчик тестовой аутентификации, настроенный с использованием имени схемы аутентификации " Test ":
builder.ConfigureTestServices(x =>
{
x.AddScoped<IIdentityProvider, FakeIdentityProvider>(factory => new FakeIdentityProvider(User));
x.AddAuthentication("Test")
.AddScheme<AuthenticationSchemeOptions, TestAuthenticationHandler>("Test", null);
});
Наши тесты проверки подлинности на предъявителя делают такой запрос:
var factory = new WebApiApplicationFactory();
var client = factory.CreateClient();
var oktaToken = await TestConfiguration.GetOktaTokenAsync();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{oktaToken}");
await client.PostAsync(uri, content);
По какой-то причине наша тестовая проверка подлинности всегда использует схему проверки подлинности по умолчанию, определенную в нашей интеграции WebApplicationFactory и никогда не использует тот, который, по нашему мнению, должен основываться на запросе.
x.AddAuthentication("Test")
.AddScheme<AuthenticationSchemeOptions, TestAuthenticationHandler>("Test", null);
Кто-нибудь знает, что мы делаем не так?