2016-10-13 3 views
2

Peut-être que c'est plus une question ASP.NET MVC qu'une question Orchard mais je suis relativement nouveau à la fois et je ne connais pas la réponse dans les deux cas. Les applications ASP.NET MVC n'ont techniquement pas de point d'entrée unique, alors où dois-je mettre du code que je veux toujours exécuter chaque fois que quelqu'un visite une page, indépendamment de la couche ou de l'origine ou des permissions ? Existe-t-il une façon spécifique pour Orchard de le faire?Où dois-je mettre du code que je veux toujours exécuter pour chaque requête?

Si cela fait une différence, ce que j'essaie spécifiquement de faire en ce moment, c'est de restreindre la plage IP qui a accès à mon site Web. Je veux examiner chaque demande entrante et vérifier si l'utilisateur est authentifié ou a une adresse IP dans la plage autorisée que j'ai configurée dans mes paramètres personnalisés.

Je peux penser à quelques moyens rapides et sales pour y parvenir, comme mettre le chèque Layout et envelopper une condition autour de toutes mes zones ou mettre en œuvre IThemeSelector pour passer à un autre thème, mais je voudrais le faire correctement.

Répondre

4

Tout ce que devez-vous faire pour y parvenir, met en œuvre de nouveaux IActionFilter ou IAuthorizationFilter comme ce qui suit:

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 
    } 
} 

Mais si vous voulez seulement autorisons en fonction des éléments de contenu (comme: Widgets, Pages, projections) , vous pouvez mettre en œuvre IAuthorizationServiceEventHandler:

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

    public void Adjust(CheckAccessContext context) { 
    } 

    public void Complete(CheckAccessContext context) { 
    } 
} 

Le meilleur exemple que vous pouvez suivre pour mettre en œuvre cette approche est SecurableContentItemsAuthorizationEventHandler, vous pouvez le trouver dans le module Orchard.ContentPermissions.

+0

Cela a répondu à ma question sur l'endroit où mettre un tel code. Toutefois, j'ai maintenant le problème que je ne peux pas rediriger dans la méthode 'OnResultExecuting' si ma vérification échoue parce que" Impossible de rediriger après que les en-têtes HTTP ont déjà été définis ". Une idée s'il y a un moyen de contourner cela? – Lawyerson

+0

Désolé, c'est mon erreur, s'il vous plaît voir la réponse mise à jour, devrait utiliser 'IActionFilter' plutôt que 'IResultFilter' pour attraper la demande avant de traiter l'action elle-même. – mdameer

+0

Cheers, tout ce que je voulais savoir et plus encore! – Lawyerson