#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) не вызывается во время отладки, поэтому я считаю, что что-то в моей службе аутентификации для тестирования настроено неправильно.
Я также попытался временно удалить аутентификацию из класса запуска, но не смог увидеть никакого эффекта.
Этот метод основан на данном руководстве по тестированию интеграции от корпорации Майкрософт.
Что еще я мог бы проверить или попробовать, чтобы правильно имитировать аутентификацию?