1

我正在创建一个 MVC4 多租户站点,该站点为每个租户使用单独的数据库,并且一直试图让会员资格为每个租户工作,但没有任何运气。

出于某种原因,无论我做什么,connectionStringField 始终为空。任何想法为什么会发生这种情况?

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);  
      }
}
4

1 回答 1

6

你不能让这个工作。即使你能弄清楚如何让反射以你想要的方式发挥作用。这将导致不稳定和意想不到的结果。

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

内置的会员系统并非旨在在运行时更改其内部数据。它旨在为多个应用程序使用单个数据库。

如果您坚持为每个租户使用单独的数据库,那么您将不得不实现自己的身份验证系统,因为成员资格在您希望的情况下根本无法工作。起初它可能看起来有效,但随着您的网站获得更多并发用户,它是一个定时炸弹,等待在您的脸上爆炸。

于 2012-10-17T01:49:04.350 回答