4

FHI,asp.net mvc et portail comme la fonctionnalité

je dois construire un site avec un certain portail comme la fonctionnalité où un param dans la demande sera indentifier le portail. comme si http:/domaine/contrôleur/action/portail

Maintenant mon problème est si un portail n'existe pas, il doit y avoir une redirection vers un autre site/page et un utilisateur peut se connecter à un portail, mais si le l'utilisateur arrive sur un autre portail, l'utilisateur doit être redirigé vers la page de connexion de ce portail.

J'ai quelque chose qui fonctionne maintenant, mais je pense qu'il doit y avoir une place centrale dans le pipeline pour gérer cela. Ma solution actuelle utilise un filtre d'action personnalisé qui vérifie le paramètre de portail et voit si le portail existe et vérifie si l'utilisateur s'est connecté dans ce portail (le portail pour lequel l'utilisateur s'est connecté figure dans le cookie d'authentification). Je fais mes propres IIndentiy et IPrincipal dans l'événement application_postauthentication.

je 2 problèmes avec mon approche actuelle:

1: Il est pas vraiment appliquée, je dois ajouter les attributs à tous les contrôleurs et/ou des actions.

2: L'isauthenticated sur un utilisateur ne fonctionne pas vraiment, je voudrais que cela fonctionne. Mais pour cela j'ai besoin d'avoir accès aux paramètres de la route quand je crée mon IPrincipal/IIndenty et je n'arrive pas à trouver un endroit correct pour le faire. J'espère que quelqu'un peut me donner quelques conseils, Richard.

Répondre

0

Vous pouvez appliquer l'autorisation de l'utilisateur via un attribut du contrôleur. Vous appliquer à chaque action (à la fois obtenir et poster). Je pense qu'il est raisonnable d'ajouter une sorte de validation à chaque action dans le contrôleur pour écrire du code sécurisé, s'il vous plaît corrigez-moi si je me trompe ici.

+0

C'est une option, et c'est ce que je fais maintenant. Mais je pense que ce n'est pas la bonne approche car c'est en fait une application large et pas au niveau du contrôleur.En d'autres termes, je pense que l'application doit appliquer les règles et si le portail n'existe pas rediriger et même pas la peine d'essayer d'aller à un contrôleur. Cela devrait plutôt ressembler à la route n'existe pas et il n'y a pas d'endroit où aller mais rediriger. Il en va de même pour l'identité de l'utilisateur, il ne devrait pas être autorisé pour l'application de trou s'il va à un portail, il n'est pas connecté. – Richard

1

Il y a plusieurs façons de faire cela (comme toujours ...). Si vous voulez le faire dans le contrôleur (ou via un attribut) mais que vous voulez également le faire globalement, vous pouvez toujours utiliser une classe de contrôleur de base personnalisée et y appliquer la logique. L'actionfilterattribute est héritée et bob est ton oncle. D'autre part, ce vraiment ressemble à un problème de routage pour moi. Donc, je penserais probablement à créer un itinéraire personnalisé pour gérer ce que vous faites. Si vous faites cela, alors une fois que vous l'aurez fait fonctionner, vous aurez envie de tester en charge pour vous assurer que vous avez une bonne stratégie de mise en cache (de sorte que chaque requête n'est pas une recherche db pour l'itinéraire + un autre pour tout ce qui se passe dans le contrôleur).

0

Pour la redirection de portails manquante, je gérerais cela dans le routage. Si vous avez un nombre relativement petit de portails, vous pouvez le faire en créant un itinéraire unique pour chacun de vos contrôleurs, puis en définissant un itinéraire par défaut pour la redirection. Les routes sont évaluées dans l'ordre où vous les créez, il suffit donc de mettre la route par défaut en bas. Votre inscription d'itinéraire ressemblerait à quelque chose comme ceci:

routes.MapRoute(
     "Portal1", 
     "{controller}/{action}/FirstPortal", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "FirstPortal"} 
    ); 

routes.MapRoute(
     "Portal2", 
     "{controller}/{action}/SecondPortal", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "SecondPortal"} 
    ); 

routes.MapRoute(
     "Default", 
     "{controller}/{action}", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "Default"} 
    ); 

De cette façon, vous pouvez utiliser la valeur de route « portail » pour sélectionner le portail, et toute demande qui ne correspond pas sera acheminé vers le contrôleur/action spécifiée dans votre Route par défaut, qui peut prendre soin de rediriger l'utilisateur de manière appropriée.