ASP MVC身份动态连接字符串

时间:2019-02-28 15:36:30

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

是否可以将ApplicationDbContext的连接字符串从Web.config移动到某个数据库并将其存储为:

  • User1 | connstring1
  • User2 | connstring2

并根据在登录页面中输入的用户名从数据库中读取? 我尝试了几件事,但都失败了。 我知道如何动态设置连接字符串,但是我的主要问题是在显示“登录”页面之前创建了ApplicationDbContext,并且我无法获取用户数据来搜索数据库中的connstring。 是否可以通过单击“登录”而不是Startup.cs来调用StartupAuth(app)?

我想要达到的目的: 我想拥有一个带有数据库的IIS。该数据库用于指向登录用户的特定IP地址(SQL服务器)。

更新

这是我的模型第一个EF实体类的代码:

public advokatEntities() : base(GetConnectionString())
    {  
    }

    public static string GetConnectionString()
    {
        if (HttpContext.Current.Session["advokatEntities"] != null)
        {
            return HttpContext.Current.Session["advokatEntities"].ToString();
        }
        else
        {
            using (redirectionEntities db = new redirectionEntities())
            {
                string companyName = "ines";
                string server = db.redirections.Where(x => x.company == companyName).FirstOrDefault().adress;
                string providerConnectionString = string.Format("server={0};user id=root;password=K0r1sn1k12345;persistsecurityinfo=True;database={1}", server,companyName);
                var efConnection = new EntityConnectionStringBuilder();
                efConnection.Provider = "MySql.Data.MySqlClient";
                efConnection.ProviderConnectionString = providerConnectionString;
                efConnection.Metadata = "res://*/Models.Advokat.csdl|res://*/Models.Advokat.ssdl|res://*/Models.Advokat.msl";
                HttpContext.Current.Session["advokatEntities"] = efConnection.ToString();
                return efConnection.ToString();
            }
        }
    }

这有效,我只需要将字符串 companyName 更改为用户在登录时输入的内容即可。这不是什么大问题,我认为可以做到...

当我尝试使用Identity的ApplicationDbContext执行此操作时遇到了一个问题

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base(GetConnectionString())
        {

        } 
        public static string GetConnectionString()
        {
            return "server=192.168.1.122;userid=root;password=K0r1sn1k12345;database=ines;persistsecurityinfo=True";
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
}

我尝试将连接字符串放入会话中,但它返回null,因为在创建ApplicationDbContext时没有会话。 我可以通过在登录页面中将companyName作为参数传递来以某种方式从redirectionEntities读取连接字符串吗?

理想的情况是:

  1. 显示登录页面
  2. 用户输入登录数据(公司,用户名,密码),然后单击“登录”
  3. 公司的应用程序检查redirectionEntities并动态创建Identity和advokatEntities的connStrings(除了advokatEntities首先是数据库并且在连接字符串中包含元数据之外,其他两个相同)
  4. 根据用户名密码对用户进行身份验证
  5. 在用户会话中存储connectionStrings,以防止针对每个数据查询从数据库中读取数据。

这完全可以实现吗?还是将所有用户数据移动到redirectionEntities数据库会更容易?

0 个答案:

没有答案