小编Die*_*337的帖子

多租户SQLMembershipProvider ASP.NET MVC

我正在尝试使用多租户的ASP.NET MVC应用程序迁移到Azure(包括SQL Azure).每个客户都拥有自己的数据库,这些数据库是独立的,包括所有会员资格.

我们可以在初始化SqlMembershipProvider对象时将连接字符串设置为SqlMembershipProvider.但是,对不同子域(在同一会话中)的后续请求不会更改连接字符串.我找到了一个示例,其中实现重写了SqlMembershipProviders ConnectionString,但这在System.Web dll的4.0版本中是不可能的.

我们可以实现单个成员资格数据库并对其进行身份验证......但我们希望在此SAAS模型中保留客户凭据.

那么问题是如何为每个请求动态更改SQLMembershipProviders连接字符串?

Web.config文件

<membership defaultProvider="TenantMembershipProvider">
        <providers>
            <clear/>        
    <add name="TenantMembershipProvider" type="ABC.Infrastructure.MultiTenancy.TenantMembershipProvider, ABC"
         connectionStringName="ApplicationServices" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false"
         requiresUniqueEmail="false" passwordFormat="Clear" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6"
         minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/>            

        </providers>
    </membership>
Run Code Online (Sandbox Code Playgroud)

TenantMembershipProvider.cs处理初始化

public class TenantMembershipProvider : SqlMembershipProvider
{

    private SiteLinqSession _session;
    private MasterSession _masterSession;
    private static readonly Dictionary<string, Customer> _customers = new Dictionary<string, Customer>();
    private static string _host;


    public override void Initialize(string name, NameValueCollection config)
    {

        base.Initialize(name, config);

        string connectionString = GetConnectionString();
        FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
                    connectionStringField.SetValue(this, …
Run Code Online (Sandbox Code Playgroud)

azure sqlmembershipprovider multi-tenant asp.net-mvc-3 azure-sql-database

4
推荐指数
1
解决办法
1761
查看次数