我目前有一个站点,不同的用户可以登录,并且根据他们的子域,显示来自不同数据库的不同数据。我正在重写 SqlMembershipProvider 以使用“临时”连接字符串,这是我在初始化方法期间动态设置的,根据这篇文章的说明:
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:我可以有一个数据库,但是,给定子域中的用户需要能够在自己的子域中添加/编辑/删除用户,而不会看到其他子域的用户。在这个计划下这可能吗?