我目前有一个不同用户可以登录的站点,并且根据他们的子域,会显示来自不同数据库的不同数据。我重写SqlMembershipProvider使用“temp”连接字符串,我根据这篇文章的说明在Initialize Method期间动态设置:
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);
}
问题是SqlMembershipProvider类似乎是“静态的”,因为当多个用户从不同的子域连接时,他们最终会看到来自其中一个数据库的用户帐户,而不是他们自己的每个数据库。看起来应用程序调用Initialize,而不是基于每个请求。
所以我的问题是......实施解决方案的最简单方法是什么?
我之前没有写过自定义提供程序,所以我不确定它是如何工作的,或者有什么限制。如果我自己写的话,如果我忽视某些东西(更不用说它将花费的时间),总会有安全漏洞的可能性。有什么想法吗?
更新1: 我可以拥有一个数据库,但是,给定子域中的用户需要能够在他们自己的子域中添加/编辑/删除用户,而无需查看其他子域的用户。在这个计划下,这可能吗?
答案 0 :(得分:2)
提供了SQLMembershipProvider的代码here。您可以通过将项目添加到解决方案并更改web.config中的命名空间引用来扩展/更改您认为必要的内容。
答案 1 :(得分:0)
我已经使用单个成员资格数据库来处理所有登录,然后根据他们登录的域将它们连接到相应的数据库。