Использование правильной схемы аутентификации в тесте интеграции NET Core API - PullRequest
2 голосов
/ 27 мая 2020

Мы пытаемся поддерживать несколько схем аутентификации. Это работает в нетестовом коде, но не работает в наших интеграционных тестах.

В наших интеграционных тестах мы не можем использовать правильную схему аутентификации для данного теста. Некоторые тесты проверяют нашу 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);

Кто-нибудь знает, что мы делаем не так?

1 Ответ

0 голосов
/ 26 августа 2020

Добавьте ниже код над AddAuthentication ("Test"), тогда он будет работать и распознавать схему тестирования.

                services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = "Test";
                    options.DefaultChallengeScheme = "Test";
                });
...