2016-05-18 5 views
4

Я пытаюсь реализовать IAuthenticationFilter (Web Api 2 аромат, не вкус MVC), и я борюсь с порядком выполнения кода. Я бы ожидал, что фильтр проверки подлинности будет запущен перед любыми материалами на основе контроллера, чтобы я мог установить соответствующий основной компонент, а затем загрузить соответствующие данные пользователя из моего DbContext в какой-то базовый ApiController.Как запустить код в ApiController после AuthenticationFilter, перед действием?

Это поток, я после того, как:

AuthenticationFilter ==> BaseController ==> Controller/Action 
  1. AuthenticationFilter: - заголовок Test авторизации и установить основную, если все хорошо.

  2. BaseController: - Использование принципала найти полную запись пользователя в базе данных и присвоить его protected собственности.

  3. контроллер/действие: - Полное действие в нормальном режиме, имеет доступ к записи пользователя как установлено в BaseController.

Я не уверен, куда поместить код в BaseController для того, чтобы он выполнить после фильтра аутентификации, но перед тем разрешенного контроллера/действия.

Вопрос

Так что мой вопрос два раза: Я буду об этом неправильно? Если нет, как мне выполнить шаг 2?

+1

Получить полную запись пользователя в действии, как обычно, с помощью принципала, установленного в 'AuthenticationFilter'. Вы можете получить его в защищенном методе, который действие вызывает раньше, когда вызывается. – Nkosi

+1

Можете ли вы показать какой-то код, чтобы привести пример «BaseController» и использовать его в Controller/action – Nkosi

+0

@Nkosi спасибо, это определенно сработает, но я надеюсь избежать необходимости делать это в каждом действии. –

ответ

3

Вот что я в итоге сделал. В моей BaseController я сделал защищенное свойство LoggedInUser, и сделал специальный поглотитель:

private User _loggedInUser; 
protected User LoggedInUser 
{ 
    get 
    { 
     if (_loggedInUser != null) return _loggedInUser; 

     var identity = RequestContext.Principal.Identity; 
     var userId = identity.GetUserId(); 

     _loggedInUser = MyDbContext.Users.Find(userId); 
     return _loggedInUser; 
    } 
} 

Это позволило мне сохранить код в одном месте, в BaseController, в том же время позволяя мне отложить попытку выборки пользователя пока не произошла аутентификация.

+1

Был в середине написания моего ответа, когда вы предоставили свои. :) Вы можете использовать 'User' контроллера вместо' RequestContext', а также – Nkosi

Смежные вопросы