У меня есть приложение 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, без необходимости в новом методе.Для того, чтобы взять под контроль инициализацию репозитория, вы должны были бы реализовать некоторую ленивую / позднюю инициализацию в самом репозитории в каждой реализации.Мне не нравится это решение, потому что оно добавляет ненужную сложность и, что более важно, связь между контроллером и хранилищем.Реализация репозитория может использоваться в других контекстах, где ленивая инициализация не имеет смысла ИМХО.