У меня есть сервисы ODATA с одной схемой. Они указывают на базу данных разработки и обслуживаются через Службу данных WCF, которая затем используется клиентами, использующими Excel / Powerpivot, для извлечения собственных данных для отчетов и т. Д.
Служба защищена во время выполнения посредством почти такой же базовой аутентификации, описанной здесь: http://msdn.microsoft.com/en-us/data/gg192997
Теперь то, как это должно работать в реальной среде, находится на сервере и подключается к различным базам данных на основе предоставленного имени пользователя / пароля. Пользователи будут вводить «username @ clientID» и «password». Затем имя пользователя @ clientID разделяется (), и имя пользователя / пароль проверяется в базе данных SQL. Но URL сервера базы данных для проверки будет определяться ClientID.
Кроме того, после авторизации службе данных WCF необходимо вернуть данные из базы данных, соответствующие ClientID.
Подход, который я попробовал, состоял в том, чтобы изменить строку подключения в файле web.config, но это не работает, потому что он говорит, что файл доступен только для чтения. Я даже не уверен, сработало ли бы это вообще. Что мне нужно сделать, так это заставить службу данных EDMX / WCF возвращать данные из правильной базы данных. Вот что я пытался сделать:
private static bool TryAuthenticate(string user, string password, out IPrincipal principal)
{
Configuration myWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
myWebConfig.AppSettings.Settings["test"].Value = "Hello";
myWebConfig.Save();
string newConnStr = myWebConfig.ConnectionStrings.ConnectionStrings["IntelCorpEntities"].ToString();
newConnStr.ToString().Replace("SERGEIX01", "SERVERX01");
myWebConfig.ConnectionStrings.ConnectionStrings["IntelCorpEntities"].ConnectionString = newConnStr;
myWebConfig.Save();
if (user.ToLower().Equals("admin") && password.Equals("password"))
{
principal = new GenericPrincipal(new GenericIdentity(user), new string[] { "Users" });
return true;
}
else
{
principal = null;
return false;
}
}