使用Asp.net MVC和Identity2的动态数据库连接

时间:2016-01-07 15:33:59

标签: asp.net-mvc entity-framework asp.net-identity

我正在asp.net mvc中开发一个Web应用程序。 我的应用使用多个数据库。 处理的数据库取决于记录的用户。 我管理两个级别的登录:

  • " master" Level1数据库,我有关于登录用户名/电子邮件和"特定"的信息。要使用的数据库。
  • "特定"等级2我使用Identity2管理用户和角色的数据库。

实施例: 在"主人"数据库我在User表中有一条记录: - username = user1 - databaseToUse =" specificDb1"

在"具体"数据库名为specificDb1,对于同一个用户,我在User表中有一条记录,只需要管理用户身份验证等等。

我想要实现的目标是:

  1. 启动网站,点击登录,插入用户名和密码,点击登录。
  2. 在master数据库中搜索用户名(如果存在),获取与用户关联的特定数据库名称。
  3. 在此处,动态地设置"特定"的连接字符串。数据库并执行Identity 2登录操作。
  4. 第1点和第2点没有问题。问题出在第3点。 我对两个(主数据库和特定数据库)使用EntityFramework 6 Code First。

    关于Identity的配置部分,我在Startup.Auth.cs中看到:

            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
    

    我应该更改身份配置中的内容吗?

    提前致谢。

1 个答案:

答案 0 :(得分:5)

花了几个小时在这里搜索我的个人(可能不是最好的)工作解决方案。

在AccountController的登录操作中,在第一次检入&#34; master&#34;数据库,设置&#34;具体&#34;会话范围中的数据库信息:

//Save the database infos in Session.
Session.Add("SqlServerInstance", masterUser.Company.DatabaseServer);
Session.Add("DbName", masterUser.Company.DatabaseName);

始终在AccountController中更新SignInManager和UserManager属性,修复Identity上下文的连接字符串:

public ApplicationSignInManager SignInManager
    {
        get
        {
            //Set manually the right connection string used by the Identity database context.
            HttpContext.GetOwinContext().Get<ApplicationDbContext>().Database.Connection.ConnectionString = ApplicationDbContext.GetConnectionString();

            return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
        }
        private set
        {
            _signInManager = value;
        }
    }

    public ApplicationUserManager UserManager
    {
        get
        {
            //Set manually the right connection string used by the Identity database context.
            HttpContext.GetOwinContext().Get<ApplicationDbContext>().Database.Connection.ConnectionString = ApplicationDbContext.GetConnectionString();

            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

最后给我们提供连接字符串的方法:

/// <summary>
    /// Get the connection string getting SqlServerInstance and DbName from Session.
    /// </summary>
    public static string GetConnectionString()
    {

        string sqlServerInstance = DEFAULT_SQLSERVERINSTANCE;
        if (HttpContext.Current.Session != null && HttpContext.Current.Session["SqlServerInstance"] != null)
            sqlServerInstance = Convert.ToString(HttpContext.Current.Session["SqlServerInstance"]);

        string dbName = DEFAULT_DBNAME;
        if (HttpContext.Current.Session != null && HttpContext.Current.Session["DbName"] != null)
            dbName = Convert.ToString(HttpContext.Current.Session["DbName"]);

        return "Data Source=" + sqlServerInstance + ";Initial Catalog=" + dbName + ";Integrated Security=True";

    }

希望这可以提供帮助。