当前位置:  开发笔记 > 后端 > 正文

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

如何解决《使用Asp.netMVC和Identity2的动态数据库连接》经验,为你挑选了1个好方法。

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

我拥有有关登录用户名/电子邮件和要使用的“特定”数据库的信息的“主”数据库上的Level1。

我使用Identity2管理用户和角色的“特定”数据库上的Level2。

示例:在“主”数据库中,我在用户表中有一条记录,其中包含:-用户名=用户1-databaseToUse =“ specificDb1”

对于同一个用户,在名为“ specificDb1”的“特定”数据库中,我在用户表中有一条记录,其中包含管理用户身份验证所需的全部内容。

我想要实现的是:

    启动网站,单击登录,输入用户名和密码,然后单击登录。

    在主数据库中搜索用户名(如果存在),获取与用户关联的特定数据库名称。

    在此处动态设置“特定”数据库的连接字符串,并执行Identity 2登录操作。

第1点和第2点没有问题。问题出在第3点。我对(主数据库和特定数据库)数据库都使用EntityFramework 6 Code First。

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

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

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

提前致谢。



1> jacktric..:

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

在AccountController的Login操作中,首先签入“ master”数据库后,在Session作用域中设置“ specific”数据库信息:

//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().Database.Connection.ConnectionString = ApplicationDbContext.GetConnectionString();

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

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

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

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

/// 
    /// Get the connection string getting SqlServerInstance and DbName from Session.
    /// 
    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";

    }

希望这会有所帮助。

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有