У меня есть приложение .NET 4.6 WebApi 2.0 OWIN, которое обслуживает HTTP-запросы.
Эти запросы проходят проверку подлинности, и мы храним определенные утверждения в RequestContext ClaimsIdentity (UserId, код клиента)
У нас также есть структура контроллеров, служб и репозитория.
Наши Сервисы вводятся в Контроллеры через Ninject, а Репозитории в Сервисы.
Когда пользователь выполняет определенные запросы, нам нужно проверить их разрешения. Служба обычно должна знать: UserId, ClientCode, группы, к которым у пользователя есть доступ и разрешения для каждой группы (чтение, запись и т. Д.). Последний хранится только в базе данных.
Текущий поток при выполнении запроса: получить userId и clientCode из утверждений RequestContext, использовать этот ID пользователя для получения разрешений группы из базы данных. Создайте объект UserCredentials
с этими свойствами.
Этот объект затем передается экземплярам Сервиса после того, как они были введены
Это пример:
public PeopleController(IPeopleService peopleService, IUserManagementService userManagementService)
{
var clientCode = RequestContext.GetClientCode();
var userId = RequestContext.GetUserId();
var permissions = userManagementService.GetUserPermissions(userId, clientCode);
}
peopleService.InjectCredentials(new services.Models.UserCredentials()
{
ClientCode = clientCode,
UserId = UserId,
Permissions = UserPermissions
});
_peopleService = peopleService;
}
Это не выглядит очень элегантно для нас, так как нам нужно повторять этот код везде и сделать IPeopleService зависимым, что пользователь не забудет вызвать метод InjectCredentials.
Итак, мой вопрос: как я могу сделать этот класс UserCredentials Injectable таким образом, чтобы его можно было передать в качестве параметра конструктору IPeopleService?
Основной блок состоит в том, что он зависит от HttpRequestContext, который доступен только на самом контроллере
Спасибо
РЕДАКТИРОВАТЬ: Я знаю, что объект UserCredentials также может быть передан в качестве параметра для каждого метода службы (который на самом деле лучше, чем метод InjectCredentials)