2009-02-02 8 views
1

J'ai actuellement un site où différents utilisateurs peuvent se connecter, et en fonction de leur sous-domaine, sont présentés avec des données différentes provenant de différentes bases de données. J'Outrepasser la SqlMembershipProvider d'utiliser une chaîne de connexion « temp », que je mets dynamiquement au cours de la méthode initialize, selon les instructions de ce billet:Meilleure façon de mettre en œuvre ce schéma de connexion dynamique pour asp.net

http://forums.asp.net/p/997608/2209437.aspx

public override void Initialize(string name, NameValueCollection config) 
    { 
     // intercept the setting of the connection string so that we can set it ourselves... 
     string specifiedConnectionString = config["connectionStringName"]; 

     ConnectionStringSettings connectionString = ConfigurationManager.ConnectionStrings[specifiedConnectionString]; 

     var fi = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 

     fi.SetValue(connectionString, false); 

     connectionString.ConnectionString = WakeflyClientHelper.GetClientConnectionStringByCurrentSubdomain(); 

     config["connectionStringName"] = connectionString.Name; 

     // Pass doctored config to base classes 
     base.Initialize(name, config); 
    } 

Le problème est que la classe SqlMembershipProvider semble « statique En effet, lorsque plusieurs utilisateurs se connectent à partir de différents sous-domaines, ils finissent par voir les comptes d'utilisateurs de l'une des bases de données, et non chacune des leurs. Il semble que l'initialisation est appelée par l'application, et non par requête.

Donc, ma question à vous est ... Quelle serait la meilleure façon de mettre en œuvre une solution à cela?

Je n'ai jamais écrit de fournisseur personnalisé, donc je ne sais pas comment cela fonctionne, ni quelles sont les limitations. Et si je l'écris moi-même, il y a toujours la possibilité de failles de sécurité si j'oublie quelque chose (sans compter le temps que cela prendra). Des idées? Je pourrais avoir une seule base de données, cependant, l'utilisateur dans un sous-domaine donné doit pouvoir ajouter/éditer/supprimer des utilisateurs dans leur propre sous-domaine, sans voir les utilisateurs d'autres sous-domaines. Serait-ce possible sous ce régime?

Répondre

2

Le code pour le SqlMembershipProvider est fourni here. Vous pouvez étendre/modifier ce que vous pensez nécessaire en ajoutant le projet à votre solution et en modifiant les références d'espace de noms dans web.config.

+0

Parfait! Exactement ce que je cherchais. Je viens de remplacer le code dans le SqlConnectionHelper pour toujours appeler ma méthode de chaîne de connexion sous-domaine. De cette façon, il ne "cache" pas la première chaîne de connexion avec laquelle il est initialisé! –

0

Je l'ai fait exactement cela à l'aide d'une seule base de données de membres pour gérer toutes les connexions, puis les raccorder à la base de données appropriée en fonction du domaine dans lequel ils se sont connectés.