ASP.NET MVC 4并使用CodeFirst动态更改成员资格连接字符串

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)

Eri*_*sch 6

你无法做到这一点.即使你可以弄清楚如何让反射以你想要的方式运作.这将导致不稳定和意外结果.

原因是成员资格提供程序是一个全局静态单个实例,用于所有并发用户.这意味着如果您更改一个用户的连接字符串,它会为所有用户更改它.更糟糕的是,您可以将其更改为一个,然后将上下文切换到另一个用户并且他们可能会覆盖该更改,然后返回并且应用程序不处于它认为它所处的状态.

内置的Membership系统不是为了让内部数据在运行时更改而设计的.它旨在将单个数据库用于多个应用程序.

如果您坚持为每个租户使用单独的数据库,那么您将必须实现自己的身份验证系统,因为成员资格根本无法在您希望的情况下工作.它似乎最初可以工作,但随着你的网站获得更多的并发用户,这是一个滴答作响的定时炸弹等待你的脸.