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

Where should I put code that I want to always run for each request?

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

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

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

我可以想出一些快速而肮脏的方法来实现这一点,比如将检查放在 Layout 中并在我的所有区域周围包装一个条件或实施 IThemeSelector 以切换到不同的主题但是我想把它做好。

要实现这一点,您应该做的就是实施新的 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 模块中找到它。