J'écris une application multi-locataires utilisant une base de données une base de données par modèle de locataire. J'ai permis à chaque compte d'utilisateur d'accéder à plusieurs locataires (aussi longtemps que ce locataire leur a donné accès)
Chaque page envoyée au navigateur inclut le télancement actuel sur site.master P>
if (request.TenantId != user.CurrentTenantId) return false
4 Réponses :
Vous pouvez vérifier votre dans l'événement Application_Request dans le fichier global.asax.cs. Si ce dont vous avez besoin est peuplé via la liaison MVC Model, alors écrivez peut-être un facteur d'action personnalisé pour le vérifier et l'enregistrer avec toutes les actions via GlobalFilter. P>
Vous pouvez appliquer un filtre au niveau du contrôleur et vérifier le télement d'envoi. Les filtres de niveau du contrôleur ne doivent plus être plus difficiles que les filtres d'action. Pour mon projet, je devais vérifier l'autorisation de la même manière que j'ai envahi la classe du contrôleur, puis hérité de ma propre classe de contrôleur, car j'avais des besoins très spéciaux. p>
Où allez-vous stocker l'identifiant du locataire du côté du client? Il me semble que vous devriez utiliser un objet de session pour le faire. p>
J'ai déjà une classe de contrôleur de base que tous les contrôleurs héritent de. Comment puis-je utiliser ceci pour ajouter un filtre? Et certainement cela n'affecterait certainement que des méthodes d'actionRésultes (elles proviennent de la forme des soumissions afin que je puisse vérifier l'un quelconque des champs du formulaire), mais pas ceux JSONRESULT (car ceux-ci sont AJAX soumet et ils ne contiennent que les champs réellement soumis, et non l'objet de la collection de formulaires. )
Vous pouvez vous écrire propre filtre: P>
Comment puis-je obtenir un certain code pour exécuter avant chaque action du contrôleur dans ASP.NET MVC 2? exécution du code avant toute action p>
Bien sûr, il n'y a pas de réponse prête pour votre question. Vous devez vous écrire propre logique, comment gérer le télantid. Par exemple, sur chaque action, vérifiez si cela n'a pas égalé que l'identifiant de la session de la session actuelle rend la redirection. Ou mettez-le dans un cookie et vérifiez à chaque fois le filtre si les identifiants sont égaux. C'est à vous. De mon cookie de mon point de vue est plus préférable. Mais ça mène du trafic. P>
Si j'ai bien compris, les utilisateurs auraient pu ouvrir simultanément 2 onglets différents, chacun avec un locataire différent. Et chaque page doit afficher des données pertinentes pour chaque locataire.
Ainsi signifie qu'une solution impliquant un cookie ou la session doit être supprimée car le locataire est spécifique à chaque onglet Navigateur. P>
et lisez votre réponse À Cyril Gupta's Suggestion, je comprends que le télement caché sur chaque page ne peut pas être soumis sur chaque demande Ajax. Bien sûr, une solution pourrait être de modifier votre application et de vous assurer que ceci est toujours le cas avec chaque demande AJAX. Sinon, cela éviterait également un filtre global basé sur les paramètres de la demande que le télementid peut toujours être là. P>
Je pense que la meilleure option est alors d'ajouter un segment dans l'URL qui détient le télement. Par exemple, remplacer la route par défaut avec quelque chose comme l'itinéraire suivant (si vous avez de nombreux itinéraires différents, vous devez faire très attention à éviter la collision de l'itinéraire): P>
public class FooFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var tenant = filterContext.RouteData.Values["tenant"] //do whatever you need to do before executing the action, based on the tenant } public override void OnActionExecuted(ActionExecutedContext filterContext) { var tenant = filterContext.RouteData.Values["tenant"] //do whatever you need to do after executing the action, based on the tenant } }
Désolé, de clarifier: je n'ai pas besoin que les deux onglets fonctionnent en même temps. J'ai juste besoin que la première onglet refuse de charger des données supplémentaires car l'utilisateur est maintenant connecté au compte 2nd locataire. De plus, je ne veux pas avoir l'identifiant de locataire dans l'URL, mais je l'ai disponible dans la collection de formulaires de la page si cela aide.
@JK, alors vous pouvez suivre une approche similaire, mais la récupération du télement de la demande (qui est fondamentalement ce que les autres ont déjà suggéré). Le problème est que vous auriez besoin de vous assurer que le télement est envoyé dans chaque demande Ajax