Имитация аутентификации с помощью WebApplicationFactory не работает

#c# #asp.net #.net

Вопрос:

Мы работаем над интеграционным тестом веб-API .NET 5. Для отправки тестового запроса в этот api мы используем WebApplicationFactory:

 factory = new WebApplicationFactory<Startup>();
var client = factory.WithWebHostBuilder(builder =>
{
    builder
    .UseTestServer()
    .ConfigureTestServices(services =>
    {
        services.AddAuthentication("Test")
        .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>(
                "Test", options => {});
    });
})
.CreateClient(new WebApplicationFactoryClientOptions
{
        AllowAutoRedirect = false,
});

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Test");

var result = await client.GetAsync($"{client.BaseAddress}/api/mycontroller/{par1}/{par2}");
 

И вот как определяется обработчик аутентификации:

 public class TestAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public TestAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
    ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
    : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        var claims = new[] { new Claim(ClaimTypes.Name, "Test user") };
        var identity = new ClaimsIdentity(claims, "Test");
        var principal = new ClaimsPrincipal(identity);
        var ticket = new AuthenticationTicket(principal, "Test");
        var result = AuthenticateResult.Success(ticket);
        return Task.FromResult(result);
    }
}
 

Метод API имеет атрибут [Авторизовать]. Если я удалю его, метод будет выполнен нормально. Поэтому я предполагаю, что клиентский код, маршрутизация и т. Д. Работают правильно.

Результат GetAsync равен 302. Это потому, что я не разрешаю автоматическое перенаправление в этом тесте.

Но обработчик аутентификации (метод HandleAuthenticateAsync) не вызывается во время отладки, поэтому я считаю, что что-то в моей службе аутентификации для тестирования настроено неправильно.

Я также попытался временно удалить аутентификацию из класса запуска, но не смог увидеть никакого эффекта.

Этот метод основан на данном руководстве по тестированию интеграции от корпорации Майкрософт.

Что еще я мог бы проверить или попробовать, чтобы правильно имитировать аутентификацию?