2016-10-13 3 views
2

Возможно, это скорее вопрос ASP.NET MVC, чем вопрос Orchard, но я относительно новичок в обоих случаях, и я не знаю ответа в любом случае.Где я должен помещать код, который я хочу всегда запускать для каждого запроса?

ASP.NET MVC-приложения не имеют технически единой точки входа, поэтому, когда я должен помещать код, который я хочу всегда запускать каждый раз, когда кто-то посещает какую-либо страницу, независимо от уровня или происхождения или разрешений ? Есть ли определенный способ сделать это?

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

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

ответ

4

Все, что вы должны сделать, чтобы достичь этого, реализует новый IActionFilter или IAuthorizationFilter как следующее:

public class CheckAccessFilter : FilterProvider, IActionFilter, IAuthorizationFilter { 
    public void OnActionExecuting(ActionExecutingContext filterContext) { 
     // here you can check the incoming request, and how the system will deal with it, 
     // before executing the action 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) { 

    } 

    public void OnAuthorization(AuthorizationContext filterContext) { 
     // here you can authorize any request 
    } 
} 

Но если вы только хотите, чтобы уполномочить на основе элементов контента (например: Виджеты, страницы, прогнозы) , вы можете реализовать IAuthorizationServiceEventHandler:

public class IPAuthorizationEventHandler : IAuthorizationServiceEventHandler { 
    public void Checking(CheckAccessContext context) { 
    } 

    public void Adjust(CheckAccessContext context) { 
    } 

    public void Complete(CheckAccessContext context) { 
    } 
} 

лучший пример вы можете следовать, чтобы реализовать этот подход является SecurableContentItemsAuthorizationEventHandler, вы можете найти его в Orchard.ContentPermissions модуле.

+0

Это ответило на мой вопрос о том, где разместить такой код. Однако у меня теперь есть проблема, что я не могу перенаправить метод 'OnResultExecuting', если мой чек не работает, потому что« Не удается перенаправить после того, как HTTP-заголовки уже установлены ». Любая идея, если есть способ обойти это? – Lawyerson

+0

Извините, это моя ошибка, пожалуйста, см. Обновленный ответ, следует использовать «IActionFilter», а не «IResultFilter», чтобы поймать запрос перед тем, как обработать действие. – mdameer

+0

Приветствия, все, что я хотел знать и многое другое! – Lawyerson