在C#中动态设置ASP.NET成员资格DatabaseName或连接字符串

时间:2013-07-28 06:07:37

标签: c# asp.net asp.net-membership membership-provider multi-tenant

我已经成功构建了许多使用ASP.NET成员资格提供程序的应用程序。我正在进入一个多租户的新项目,我正在通过跨多个SQL Server数据库划分用户帐户来实现可扩展性。

每个数据库都安装了Memberships模式,通过在Web.Config文件中添加信息,我可以将任何一个数据库设置为我的Membership provider。但是,我的目标是使用master数据库作为查找表。此数据库有一个名为“Accounts”的表,我将该帐户的成员资格数据库存储在名为“MebershipPartition”的字段中,该字段与该表中该帐户的用户相关联(每个帐户可以有多个用户)。

以下是基本架构,删除了无关信息:

enter image description here

我要做的是通过更新的连接字符串(或者甚至只是databaseName,因为这都在同一个SQL Server上)将我的成员资格提供程序设置为该特定提供程序数据库 AFTER 我做查找。这意味着它必须在Web.Config和Global.asax文件之外发生。

我也无法使用可用连接字符串列表预先填充我的Web.Config,因为系统可能会在满足某些条件时生成新的成员资格数据库,例如在先前数据库或特定帐户上达到某个上限要求它的用户被隔离到单个数据库。所以这必须是完全动态的。

在我的研究中,我尝试了许多方法,详见以下文章:

StackOverflowASP.NET ForumsASP.NET Forums

上述解决方案均无法按预期工作。要么他们依赖解决方案在应用程序生命周期中过早执行,要么他们使用硬编码值作为连接字符串,只解决了消除对Web.Config的依赖的问题。

IDEALLY 我想公开一个我可以随时从C#类调用的方法来简单地切换成员系统根据需要使用的数据库,例如:

string Membership_DB_1 = "Server=[server];Database=database1;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"
string Membership_DB_2 = "Server=[server];Database=database2;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"
string Membership_DB_3 = "Server=[server];Database=database3;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"

Membership.SwitchConnectionString(Membership_DB_1);
Membership.SwitchConnectionString(Membership_DB_2);
Membership.SwitchConnectionString(Membership_DB_3);

我想提前感谢社区,我花了很多天(现在是几周)和这个场景搏斗,我接近转向另一个解决方案!

更新:

我也一直在研究以下解决方案,但是再次 - 它需要事先设置所有潜在连接字符串的Web.Config,从管理角度来看这是不可取的:

Another Hard Coded Solution

这是不可能的吗?接下来,我将使用Microsoft提供的Provider Toolkit Samples来研究我自己的成员资格提供程序版本,但是没有很多样本或文档可用,并且实际的下载页面在运行中缺失! 2005年 Scott Guthrie posted about it ,但正如您所看到的那样,文章中的参考文献现已丢失。我最终找到了 Download Link to the MSI here ,但我不确定代码是否得到良好维护甚至仍然相关......

我试图避免不得不深入了解Provider组件,但我打算继续前进!保持这个主题的更新,因为我去寻找同样的其他人!

1 个答案:

答案 0 :(得分:0)

您建议的切换连接字符串的方法:

Membership.SwitchConnectionString(Membership_DB_1);

听起来不切实际。不要忘记,有一个静态默认提供程序可以从多个请求线程同时访问,如果你调用这个方法,你将改变所有线程的提供程序,这不太可能是你想要的。

我必须承认,我不知道您提出的架构将如何提高可扩展性,但如果您确实希望这样做,我认为您将不得不编写自定义提供程序。