Строка динамического подключения удостоверения ASP MVC - PullRequest
0 голосов
/ 28 февраля 2019

Можно ли переместить строку подключения для ApplicationDbContext из Web.config в некоторую базу данных и сохранить ее следующим образом:

  • User1 |connstring1
  • Пользователь2 |connstring2

и считайте его из базы данных на основе имя пользователя , введенное на странице Логин ?Я попробовал несколько вещей, но все не удалось.Я знаю, как динамически устанавливать строку подключения, но моя главная проблема заключается в том, что ApplicationDbContext создается до того, как отображается страница входа в систему, и я не могу получить пользовательские данные для поиска connstring в базе данных.Есть ли способ вызвать StartupAuth (приложение) после нажатия кнопки «Войти», а не в Startup.cs?

Чего я хочу добиться с помощью этого: я хочу иметь один 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 на что-то, что пользователь вводил при входе в систему. Это не большая проблема, и я думаю, что это можно сделать ...

Я столкнулся с проблемой, когда пытался сделатьэто с помощью ApplicationDbContext Identity

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();
        }
    }
}

Я попытался поместить строку подключения в сеанс, но он возвращает ноль, потому что при создании ApplicationDbContext сеанс отсутствует. Можно ли как-то прочитать строку подключения из redirectionEntities, передавая companyName в качестве параметра со страницы входа в систему?

Идеальный сценарий будет выглядеть так:

  1. Отображается страница входа
  2. Пользователь вводит данные для входа (Компания, Имя пользователя, Пароль) и нажимает Вход
  3. Приложение проверяет redirectionEntities для Компании и динамически создает connStrings для Identity и advokatEntities (эти 2 одинаковы, за исключением, что advokatEntities является базой данных первой и имеетметаданные внутри строки подключения)
  4. Аутентифицировать пользователя на основе пароля пользователя
  5. Сохранять строки подключения в сеансе пользователя, чтобы предотвратить чтение из БД для каждого запроса данных.

Может ли это бытьдостигнуто вообще?Или было бы проще перенести все пользовательские данные в базу данных redirectionEntities?

...