Изменение строки соединения во время выполнения для OData / WCF Data Service, которая использует базовую аутентификацию - PullRequest
4 голосов
/ 15 декабря 2011

У меня есть сервисы 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;
        }
    }

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

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

1 голос
/ 23 мая 2012

В вашем 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;
}
...