我应该在哪里放置我想要为每个请求始终运行的代码?

时间:2016-10-13 09:47:27

标签: orchardcms orchardcms-1.9

也许这更像是一个ASP.NET MVC问题,而不是Orchard问题,但我对这两个问题都比较新,而且在这两种情况下我都不知道答案。

ASP.NET MVC应用程序在技术上没有单一的入口点,所以我应该在每次有人访问任何页面时放置我想要始终运行的代码,无论层或原点是什么权限?是否有特定的Orchard方式来做到这一点?

如果它有所作为,我现在特别想要做的是限制可以访问我网站的IP范围。我想查看每个传入的请求,并检查用户是否经过身份验证,或者是否具有我在自定义设置中配置的允许范围内的IP。

我可以想到一些快速而肮脏的方法来实现这一点,比如检查dplyr::select()并在我的所有区域周围设置一个条件或实现Layout切换到另一个主题,但我&# 39;我喜欢这样做。

1 个答案:

答案 0 :(得分:4)

要实现这一目标,您应该采取以下措施来实施新的IActionFilterIAuthorizationFilter

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模块中找到它。