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

Law*_*son 2 orchardcms orchardcms-1.9

也许这比Orchard问题更像是ASP.NET MVC问题,但是我对这两个问题都比较陌生,在任何情况下我都不知道答案。

从技术上讲,ASP.NET MVC应用程序没有单一入口点,那么我应该在哪里放置我希望每次有人访问任何页面时都始终运行的代码,而不管其层,起源或权限如何?果园有做到这一点的特定方法吗?

如果有所作为,那么我目前正在尝试做的是限制可以访问我的网站的IP范围。我想查看每个传入的请求,并检查用户是否已通过身份验证,或者是否具有我在自定义设置中配置的允许范围内的IP。

我可以想到一些快速而又肮脏的方法来实现此目的,例如将检查Layout并围绕我的所有区域包装一个条件,或者实施IThemeSelector以切换到其他主题,但是我想正确地做到这一点。

mda*_*eer 5

要实现此目标,您应该做的所有事情都是实施新的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
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想基于内容项(例如:小部件,页面,投影)进行授权,则可以实现IAuthorizationServiceEventHandler

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

    public void Adjust(CheckAccessContext context) { 
    }

    public void Complete(CheckAccessContext context) { 
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以遵循的最佳示例来实现此方法SecurableContentItemsAuthorizationEventHandler,您可以在Orchard.ContentPermissions模块中找到它。