Вы должны вызвать WebSecurity.InitializeDatabaseConnection Но у меня уже есть

Я прочитал несколько вопросов SO по этой теме, но, похоже, все они касаются того, куда вы должны поместить этот вызов.

Моя проблема в другом: я уже выполнил вызов WebSecurity.InitializeDatabaseConnection() и установил точки останова, чтобы знать, что он был выполнен. Но я все еще получаю сообщение invalid operation exception о том, что я должен позвонить.

В отличие от большинства других вопросов, которые касаются его в действии контроллера MVC, я столкнулся с этим HttpModule, который я написал для выполнения аутентификации для контроллера REST WebAPI. Вызов Init содержит вызов WebSecurity.InitializeDatabaseConnection. Затем метод OnAuthenticationRequest извлекает информацию об имени пользователя и пароле из заголовка Authorization запроса и вызывает метод ValidateUser класса SimpleMembershipProvider. Здесь я получаю исключение

Вы должны вызвать метод WebSecurity.InitializeDatabaseConnection перед вызовом любого другого метода класса WebSecurity.

So

а) почему я получаю это исключение, хотя уже выполнил условия, чтобы его не получать.
б) что с этим можно сделать?


person Dave Hanna    schedule 31.03.2013    source источник
comment
Можете ли вы опубликовать полную трассировку стека исключения?   -  person Eilon    schedule 31.03.2013
comment
Я изменил код, чтобы этого больше не происходило, но в трассировке стека было немного. Проблема заключалась в том, что я пытался создать свой собственный экземпляр SimpleMembershipProvider, а ЭТО никогда не было инициализировано. WebSecurity создает свой собственный экземпляр, который он и инициализирует. Я изменил свой код, чтобы вместо создания собственного экземпляра он просто использовал статический экземпляр, возвращаемый Membership.Provider, и ошибка исчезла. Я по-прежнему вызываю InitializeDatabaseConnection в методе HttpModule.Init().   -  person Dave Hanna    schedule 31.03.2013


Ответы (2)


После нескольких часов борьбы с одной и той же проблемой и установки множества точек останова я нашел решение для своей среды, надеюсь, другие смогут извлечь из этого пользу:

внутри папки App_Start

public class FilterConfig
{
  public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  {
    var attr=new InitializeSimpleMembershipAttribute();
    // here is the important part
    attr.OnActionExecuting(new ActionExecutingContext());
    filters.Add(attr);
  }
}

Фон: в моем приложении у меня есть 2 представления:

  • /Account/Register: это часть стандартных шаблонов asp.mvc 4 и имеет атрибут [AllowAnonymous]
  • /Task: это «Индекс»-представление списка дел, TaskController имеет атрибут [Authorize(Roles="Administrator")]

У меня всегда была проблема в следующем месте:

  1. сеанс отладки в браузере
  2. успешный вход
  3. открыть представление "/Task", требующее авторизации
  4. переключитесь на визуальную студию и держите браузер открытым
  5. остановить отладку
  6. изменить некоторый код внутри контроллера (достаточно установки некоторого пробела)
  7. начать сеанс отладки
  8. нажмите обновить в браузере

На данный момент метод «OnActionExecuting» внутри класса InitializeSimpleMembershipAttribute еще не был вызван (определено установкой точек останова)!

Но когда я открыл представление, которое не требует авторизации (т.е. /Account/Register), был вызван метод «OnActionExecuting». После этого я мог вызывать /Task без ошибок.

Таким образом, решение состояло в том, чтобы сделать «псевдовызов» для «OnActionExecuting» при запуске приложения.

person alpine_anil    schedule 05.12.2013

Вам не нужно устанавливать соединение с базой данных каждый раз, когда вызывается ваш HttpModule. Просто сделайте это один раз при запуске приложения. Вот статья, в которой объясняется, как использовать SimpleMembership для аутентификации. авторизация вызовов веб-API. Также есть ссылка на исходный код примера проекта.

person Kevin Junghans    schedule 02.04.2013