Конструктор контроллера ASP.NET MVC вызывается перед проверкой подлинности - PullRequest
14 голосов
/ 16 декабря 2010

У меня есть приложение ASP.NET MVC с контроллером, которое выглядит примерно так:

[Authorize]
public class MyController : Controller
{
IMyRepository myRepository;
public MyController(IMyRepository myRepository)
{
   this.myRepository = myRepository;
}

...
}

Я заметил, что этот конструктор вызывается до аутентификации пользователя, поэтому, если вы посещаете страницув первый раз конструктор вызывается перед перенаправлением вас на экран входа в систему.С этим связано много проблем, страница входа загружается медленнее, сайт подвержен DOS-атакам, и я немного нервничаю из-за того, что неаутентифицированные, неавторизованные пользователи могут вызывать код «за стенами».

Я мог бы проверить входящий запрос в конструкторе и поручительстве, если пользователь не авторизован, но я использую IOC (Windsor), что делает это немного сложным, мой репозиторий будет инициализирован независимо от того, будет ли ясохранить экземпляр, поэтому я бы оставил проверку подлинности в конструкторе каждого репозитория.Есть ли простой способ заставить .NET MVC аутентифицировать пользователя до для вызова конструктора?Я думаю, что-то вроде добавления [PrincipalPermission(SecurityAction.Demand, Authenticated = true)] к контроллеру, но, возможно, есть и лучший способ.

РЕДАКТИРОВАТЬ:

Хорошо, не слишком доволен этим, но шоу должно идтина данный момент.Я не могу отложить инициализацию репозитория до некоторого более позднего момента времени изнутри контроллера.Когда ваш контроллер использует IOC, как в моем примере, вы получаете уже реализованную реализацию вашего интерфейса репозитория в тот момент, когда создается экземпляр контроллера.Если бы у меня был контроль над создаваемым хранилищем, я мог бы просто вызвать IsAuthenticated, без необходимости в новом методе.Для того, чтобы взять под контроль инициализацию репозитория, вы должны были бы реализовать некоторую ленивую / позднюю инициализацию в самом репозитории в каждой реализации.Мне не нравится это решение, потому что оно добавляет ненужную сложность и, что более важно, связь между контроллером и хранилищем.Реализация репозитория может использоваться в других контекстах, где ленивая инициализация не имеет смысла ИМХО.

Ответы [ 4 ]

6 голосов
/ 16 декабря 2010

Необходимо создать экземпляр контроллера до того, как произойдет авторизация, поскольку он может действовать как собственный фильтр авторизации с помощью метода OnAuthorization.Изменение этого поведения потребовало бы замены некоторых основных частей конвейера mvc.Есть ли конкретная причина, по которой вы думаете, что AuthorizedAttribute может не выполнять свою работу?

Другой вариант, который вы могли бы рассмотреть, - это инициализация вашего хранилища в OnActionExecuting вашего метода контроллера, а не в конструкторе.

2 голосов
/ 07 августа 2013

Вы можете использовать HttpModules (или HttpHandler) для аутентификации запроса ранее в конвейере.

EDIT

С введением OWIN вы можете настроить все промежуточное ПО конвейера запросов и поставить авторизацию на любом этапе, который вам нужен. Та же идея, что и выше, но ее проще реализовать.

0 голосов
/ 23 декабря 2010

Что касается DOS-атак, это действительно не должно иметь значения - после первого попадания, которое часто встречается при разработке, создание контроллера должно быть дешевым. Что ж, если вы сами не используете DDOS, когда конструктор выполняет реальную работу, такую ​​как предварительное кэширование поиска в базе данных. , .

0 голосов
/ 16 декабря 2010

Пол,

, создание экземпляра контроллера - это много-много процессов перед тем, как какие-либо действия на контроллере будут вызваны.даже если злоумышленник попытается извлечь выгоду из этого промежутка времени между созданием экземпляра и экраном входа в систему, действие контроллера сможет выполняться только в том случае, если действие имеет полномочия на это, т.е. я предполагаю, что ваши действия или контроллер всена них есть атрибут [Authorize].

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...