我正在asp.net mvc中开发一个Web应用程序。 我的应用使用多个数据库。 处理的数据库取决于记录的用户。 我管理两个级别的登录:
实施例: 在"主人"数据库我在User表中有一条记录: - username = user1 - databaseToUse =" specificDb1"
在"具体"数据库名为specificDb1,对于同一个用户,我在User表中有一条记录,只需要管理用户身份验证等等。
我想要实现的目标是:
第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);
我应该更改身份配置中的内容吗?
提前致谢。
答案 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";
}
希望这可以提供帮助。