Я искал здесь много сообщений о моей проблеме, но не нашел ничего, связанного с тем, чего я пытаюсь достичь.
Я создал микрослужбу веб-API для обработки аутентификации пользователей. Служба использует структуру идентификации и выпускает токены носителя. У меня есть еще один веб-API, который защищен с помощью атрибута [Autroize] на контроллерах. Обе службы взаимодействуют с одной и той же базой данных через Entity Framework.
Одно препятствие, которое мне пришлось преодолеть при настройке этой инфраструктуры, заключалось в том, что обе службы требуют одного и того же машинного ключа в своих web.configs. Когда все развернуто, все работает отлично.
Однако я пытаюсь написать несколько интеграционных тестов для своего основного API, используя Microsoft Owin TestServer. Это позволяет мне писать интеграционные тесты для копии API в памяти, которая также использует копию базы данных в памяти с помощью миграций инфраструктуры сущностей.
Я успешно создал интеграционные тесты для своей пользовательской службы. Однако я изо всех сил пытаюсь заставить интеграционные тесты работать для моего основного сервиса. Я создал решение с новым тестовым проектом. Я также связал свою пользовательскую службу и основную службу. В начальной загрузке для интеграционных тестов я запускаю в памяти копию каждой службы, используя Startup.cs каждой службы.
Все работает нормально, пока я не попытаюсь нажать на контроллер, защищенный атрибутом [Authorize]. Я успешно попал в службу пользователя, чтобы зарегистрировать пользователя, активировать этого пользователя и получить токен носителя. Затем я передаю это в запросе основной службе в заголовке аутентификации. Однако я всегда получаю Несанкционированный ответ от службы.
Я подозреваю, что это снова связано с машинными ключами, и я попытался поместить тот же машинный ключ в App.config в рамках проекта интеграционного тестирования. Это не имело никакого значения.
Если кому-то удалось заставить этот сценарий работать, я был бы очень признателен за любые советы о том, что может быть причиной проблемы. Я не вставлял код, так как это довольно много, но был бы рад вставить любые подробности.
Тестирование таким образом очень быстрое и действительно мощное. Однако, похоже, не хватает информации о том, как заставить это работать.
ИЗМЕНИТЬ
Вот некоторый код по запросу. Два API в памяти создаются в OneTimeSetUp следующим образом:
_userApi = TestServer.Create<UserApi.Startup>();
_webApi = TestServer.Create<WebApi.Startup>();
Авторизованный HttpClient затем берется из API следующим образом:
var client = _webApi.HttpClient;
var authorizationValue = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Authorization = authorizationValue;
«токен» получен от службы пользователя.
Затем GET выполняется с использованием клиента следующим образом:
var result = await client.GetAsync(uri);
ИЗМЕНИТЬ 2
Я также должен отметить, что у меня есть аутентифицированные интеграционные тесты, работающие в User Service. Проблема только тогда, когда я пытаюсь использовать оба сервиса вместе. Например. Получите токен из пользовательской службы и используйте этот токен для аутентификации в моей основной службе. База данных инфраструктуры сущностей в памяти создается следующим образом:
AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(TestContext.CurrentContext.TestDirectory, string.Empty));
using (new ContractManagerDatabase())
{
System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseAlways<ContractManagerDatabase>());
}