Tod*_*odd 1 asp.net-mvc custom-membershipprovider
我正在创建一个MVC4多租户站点,该站点为每个租户使用单独的数据库,并且一直试图让每个租户都没有任何运气.
由于某种原因,无论我做什么,connectionStringField总是为null.任何想法为什么会这样?
public class CodeFirstMembershipProvider : MembershipProvider
{
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
base.Initialize(name, config);
// hard coded for testing
string connectionString = @"server=localhost;database=masterdb;uid=master;pwd=password";
// Set private property of Membership provider.
FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
if(connectionStringField != null)
connectionStringField.SetValue(this, connectionString);
}
}
Run Code Online (Sandbox Code Playgroud)
你无法做到这一点.即使你可以弄清楚如何让反射以你想要的方式运作.这将导致不稳定和意外结果.
原因是成员资格提供程序是一个全局静态单个实例,用于所有并发用户.这意味着如果您更改一个用户的连接字符串,它会为所有用户更改它.更糟糕的是,您可以将其更改为一个,然后将上下文切换到另一个用户并且他们可能会覆盖该更改,然后返回并且应用程序不处于它认为它所处的状态.
内置的Membership系统不是为了让内部数据在运行时更改而设计的.它旨在将单个数据库用于多个应用程序.
如果您坚持为每个租户使用单独的数据库,那么您将必须实现自己的身份验证系统,因为成员资格根本无法在您希望的情况下工作.它似乎最初可以工作,但随着你的网站获得更多的并发用户,这是一个滴答作响的定时炸弹等待你的脸.
归档时间: |
|
查看次数: |
679 次 |
最近记录: |