Identification de locataire opaque avec SQL Server et NHibernate

Nous développons une application SaaS à plusieurs locataires à la mode de nos jours (database partagée, schéma partagé), et il y a une chose que je n'aime pas:

public class Domain : BusinessObject { public virtual long TenantID { get; set; } public virtual ssortingng Name { get; set; } } 

Le TenantID me TenantID fou, comme il doit être pris en count presque partout, et c'est un problème de security: que se passe-t-il si un user API malveillant modifie TenantID à une autre valeur et va mélanger les choses.

Ce que je veux faire est de se débarrasser TenantID de ce TenantID dans nos objects de domaine, et que NHibernate ou SQL Server s'occupe de lui.

D'après ce que j'ai déjà lu sur les Internets, ceci peut être fait avec CONTEXT_INFO (voici une implémentation basée sur NHibernate ), des filters NHibernate , des Vues SQL et une combinaison de ceux-ci.

Maintenant, mes exigences sont les suivantes:

  • Supprimer toutes les mentions de TenantID des objects de domaine
  • … mais que SQL Server l'insère le cas échéant (je suppose que cela est réalisé avec default contraintes default )
  • … et de toute évidence fournir un support pour le filtrage basé sur ce critère, afin que les clients ne verront jamais datatables de l'autre
  • Si possible, évitez les vues SQL Server.
  • Avoir une solution qui fonctionne bien avec NHibernate, MARS des servers SQL et la nature générale des applications SaaS étant très concurrentes

Quelles sont vos pensées à ce sujet?

Je trouve que ce document est à peu près le Saint Graal de MultiTenant. http://msdn.microsoft.com/en-us/library/aa479086.aspx

Jetez un oeil à l'utilisation de l'une des approches telles que «Shared Database Shared Schema», puis connectez-vous à la database en utilisant un user SQL différent pour chaque locataire. Chaque user SQL verra un sous-set filtré des données et ne pourra récupérer que ses propres données, et lors de l'insertion des données, il lui sera assigné automatiquement son propre locataire.

Vous constaterez que vous n'avez plus besoin de tenir count des TenantID dans votre application et que vous pouvez simplement modéliser le rest des tables.

L'approche que j'utilise pour notre application SaaS avec db partagé et schéma partagé est montrée dans l' article de Jason Young.

Ceci dans le cadre de l' article de Jason Dentler que vous avez fourni dans votre question et de mappage des vues au lieu de arrays dans votre domaine constitue une solution assez isolée. Vous pouvez vous débarrasser complètement de TenantID de vos templates que j'aime beaucoup.

Dans mon application je l'utilise avec EntityFramework mais malheureusement, EF n'a pas une telle chose comme DriverConnectionProvider qui est vraiment une honte.