2

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

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

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

我可以想到一些快速而肮脏的方法来实现这一点,比如签入Layout并在我的所有区域周围包裹一个条件,或者实施IThemeSelector以切换到不同的主题,但我想正确地做到这一点。

4

1 回答 1

6

为了实现这一目标,您应该做的所有事情都是实施新的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
    }
}

但是,如果您只想根据内容项(例如:Widgets、Pages、Projections)进行授权,您可以实现IAuthorizationServiceEventHandler

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

    public void Adjust(CheckAccessContext context) { 
    }

    public void Complete(CheckAccessContext context) { 
    }
}

实现此方法的最佳示例是SecurableContentItemsAuthorizationEventHandler,您可以在Orchard.ContentPermissionsmodule.

于 2016-10-13T10:34:10.647 回答