如何在每次页面请求时更改asp.net成员资格的数据库?

时间:2014-11-10 09:40:04

标签: c# asp.net asp.net-mvc

我有一个场景,我的应用程序连接到url中子域的不同数据库。

我试过这段代码:

 public class Provider : SqlMembershipProvider
    {
        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {

        base.Initialize(name, config);

        // Update the private connection string field in the base class.

        SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
        sqlBuilder["Data Source"] = "My-PC\\SQLEXPRESS";
        string dbName;
        if (!string.IsNullOrEmpty(Helpers.RouteManager.GetSubDomain()))
        {
            dbName = Helpers.RouteManager.GetSubDomain().ToString()+"_db";
        }
        else
        {
            dbName = "dbName";
        }
        bool isEqual = string.Equals(name, dbName);
        sqlBuilder["Initial Catalog"] = dbName;
        sqlBuilder["Integrated Security"] = true;
        sqlBuilder["Application Name"] = "EntityFramework";
        FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
        connectionStringField.SetValue(this, sqlBuilder.ConnectionString);
    }
}

我从Application_BeginRequest()方法调用此函数。

我面临的问题是,当我构建应用程序并且它使用特定的子域命中url时,它会连接到指定的数据库,但我尝试使用不同的子域,它与asp.net成员资格相同的数据库。< / p>

但是,当我重建应用程序并尝试另一个子域时,它可以工作。

在构建解决方案后,我的代码似乎只是第一次工作。

请有人指导我。

感谢名单

2 个答案:

答案 0 :(得分:1)

尝试在Web配置文件中配置不同的成员资格提供程序。

<membership>
    <providers>
        <add name="ProviderA" connectionStringName="ConnectionA" ... />
        <add name="ProviderB" connectionStringName="ConnectionB" ... />
    </providers>
</membership>

<connectionStrings>
     <add name="ConnectionA" .... />
     <add name="ConnectionB" .... />
</connectionStrings>

然后在代码中使用此提供程序

var user = Membership.Providers["ProviderA"].GetUser(username, false);
var user = Membership.Providers["ProviderB"].GetUser(username, false);

答案 1 :(得分:0)

抱歉,这不是一个真正的答案,但我想在这里质疑你的架构。为什么您需要您的应用程序在多个数据库中包含成员资格数据?它的本质是为您的应用程序整体维护帐户详细信息(身份验证/授权)。如果您希望能够基于Url控制对应用程序某些区域的访问,则可以使用基于角色的表单身份验证来执行此操作。互联网上有很多文章在解释这一点。希望这能让你走上正确的方向。

<强>更新 我刚刚在stackoverflow上找到了这个答案。我担心看起来你想做的事情是不可能的,因为成员资格提供者是你的应用程序的所有用户之间共享的全局静态对象。基于URL更改它不仅会为该特定用户更改它,而且会为每个登录的用户更改它 check it out here