Как человек, который не любит супер-типы контроллеров, я бы подумал об использовании Dependency Injection и использовании конструктора для «инъекции» пользователя.
o / c, у этого есть некоторые недостатки. Это означает, что вам придется использовать поле для каждого использования в вашем контроллере, а также создавать привязку в инструменте IOC. Это также предполагает, что вы используете контейнер IOC.
По поводу других опций:
Предоставление его в IAdminService дает вам дополнительное преимущество, будучи доступным в других местах, а не только в Контроллере. Так что это плюс. Просто убедитесь, что вы не перегружаете свой интерфейс слишком сильно.
Использование его в базовом контроллере поначалу также заманчиво, но я обнаружил, что базовые типы контроллеров раздуваются и неправильно управляются по мере того, как добавляется все больше и больше функциональности, потому что нет множественного наследования, и людям нужно кое-что из этого и некоторые что ... Вещи могут стать ужасными. Не говоря уже о том, что если вы используете AsyncController, у вас будет два базовых типа для управления.
По сути, между вашими двумя вариантами я бы использовал интерфейс.
Независимо от того, что вы делаете, вы все равно можете добавить метод к интерфейсу и также абстрагировать его за свойством User в базовом контроллере.