Можно ли переместить строку подключения для 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 в качестве параметра со страницы входа в систему?
Идеальный сценарий будет выглядеть так:
- Отображается страница входа
- Пользователь вводит данные для входа (Компания, Имя пользователя, Пароль) и нажимает Вход
- Приложение проверяет redirectionEntities для Компании и динамически создает connStrings для Identity и advokatEntities (эти 2 одинаковы, за исключением, что advokatEntities является базой данных первой и имеетметаданные внутри строки подключения)
- Аутентифицировать пользователя на основе пароля пользователя
- Сохранять строки подключения в сеансе пользователя, чтобы предотвратить чтение из БД для каждого запроса данных.
Может ли это бытьдостигнуто вообще?Или было бы проще перенести все пользовательские данные в базу данных redirectionEntities?