ASP.NET MVC создает контроллеры, которые требуют аутентификации, хотя пользователь не прошел аутентификацию, что приводит к проблеме внедрения зависимости
У меня проблема с ASP.NET в сочетании с Unity. Сегодня конструкторы моих контроллеров, которые требуют аутентифицированных пользователей, имеют некоторые параметры, которые могут быть заполнены Unity, только если вызывающий пользователь аутентифицирован. Если я называю URL, который приводит к такому контроллеру, НЕАУТЕНТИФИЦИРОВАННЫМ, конвейер ASP.NET MVC пытается создать контроллер, и Unit выдает исключение, поскольку требуемые объекты не существуют в контейнере. Для аутентификации я использую WSFederationAuthenticationModule и SessionAuthenticationModule, а в файле web.config я настроил "Формы" в качестве режима аутентификации, чтобы заставить ASP.NET перенаправлять на страницу входа. Я ожидал, что конвейер не создает экземпляр контроллера, если пользователь не прошел проверку подлинности, но перенаправляет непосредственно на страницу входа.
1 ответ
конструкторы моих контроллеров, которые требуют аутентифицированных пользователей, имеют некоторые параметры, которые могут быть заполнены Unity, только если вызывающий пользователь аутентифицирован
Это корень вашей проблемы. Это означает, что конструктор этого сервиса делает слишком много. Конструкторы не должны делать больше, чем хранить входящие зависимости. Таким образом, вы можете составлять графы объектов с уверенностью.
Построение графов объектов в целом должно быть статичным. Это означает, что граф разрешенных объектов не должен изменяться в зависимости от условий выполнения (есть исключения, но это хорошее правило). Не должно иметь значения, авторизован пользователь или нет, класс обслуживания все еще должен быть составлен и введен. Это означает, что авторизация и загрузка данных выполняется в более поздний момент времени; момент, когда запрос фактически выполняется (что происходит непосредственно после составления графа объекта).
Поэтому вместо выполнения этой работы в конструкторе переместите эту работу в тот момент, когда выполняется метод действия. Вы можете переместить эту логику в службу, которая выполняет аутентификацию, использовать атрибут фильтра или реализовать ее с помощью декоратора.