Изменение строки подключения во время выполнения для службы данных OData / WCF, которая использует базовую проверку подлинности

У меня есть службы ODATA с единой схемой. Они указывают на базу данных разработки и обслуживаются службой данных WCF, которая затем используется клиентами, работающими с Excel / Powerpivot, для получения собственных данных для отчетов и т. Д.

Служба защищена во время выполнения с помощью той же базовой проверки подлинности, которая описана здесь: http://msdn.microsoft.com/en-us/data/gg192997

Теперь, как это должно работать в реальной среде, это сидеть на сервере и подключаться к разным базам данных на основе предоставленного имени пользователя и пароля. Пользователи будут вводить «имя пользователя @ clientID» и «пароль». 'username @ 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;
        }
    }

person Rash    schedule 15.12.2011    source источник


Ответы (2)


В производном классе DataService переопределите метод CreateDataSource и в нем определите правильную строку подключения, создайте новый экземпляр контекста объекта EF для строки подключения и верните его. Служба WCF DS не будет использовать конструктор по умолчанию в контексте объекта EF, это полностью зависит от вас, чтобы создать экземпляр с правильной строкой подключения.

person Vitek Karas MSFT    schedule 15.12.2011
comment
Спасибо! Это сработало. Извините, я не могу проголосовать за. Там написано, что мне нужно 15 повторений. - person Rash; 15.12.2011

В свой svc.cs файл добавьте следующее:

protected override NorthWindEntity CreateDataSource()
{
    System.Data.EntityClient.EntityConnection connection = new System.Data.EntityClient.EntityConnection();
    connection.ConnectionString = "";
    NorthWindEntity ctx = new NorthWindEntity(connection);
    return ctx;
}
person Maqsood Pasha    schedule 23.05.2012