Передача выражений запросов по проводам с WCF - PullRequest
2 голосов
/ 26 сентября 2011

Я хочу реализовать что-то вроде провайдера OData WCF, но с использованием NetTcpBinding вместо WebHttpBinding / REST.Я хочу, чтобы клиент мог писать запросы linq, которые прозрачно сериализуются и отправляются на сервер (или, возможно, на несколько серверов для консолидации распределенных экземпляров базы данных).

Один из способов сделать это - реализовать собственный поставщик IQueryable.Вы можете передать выражение запроса по проводам (как минимум) двумя способами:

1) Сериализировать выражение в xml, отправить его и десериализовать на сервере

2) Передать чтоболее или менее предшественник необработанного SQL серверу в виде DataContracts

1 - сложная и просто работа, и 2, очевидно, могут представлять угрозу безопасности (внедрение SQL).Скажем, например, выражение «Где» было инкапсулировано и передано на сервер следующим образом:

[DataContract]
public class WhereFilter
{
    [DataMember]
    public string Property { get; set; }

    [DataMember]
    public string Operation { get; set; }

    [DataMember]
    public string Value { get; set; }
}

Где вышеприведенное в конечном итоге представляет собой часть запроса SQL, в которой говорится «Где [SomeColumn] =« SomeValue »

Мой вопрос заключается в том, можно ли сделать соединение клиент-сервер WCF достаточно безопасным, чтобы оправдать такой подход, не создавая слишком большой угрозы безопасности?Или, в качестве альтернативы, если есть какие-либо другие способы реализации OData-подобного провайдера через NetTcpBinding, мне было бы интересно.

1 Ответ

2 голосов
/ 26 сентября 2011

Я бы начал с попытки Сериализация дерева выражений .Он направлен на то, чтобы разрешить сериализацию выражений, но я не использовал его, чтобы прокомментировать, насколько хорошо это работает.

Если это не удастся, вы сможете создавать запросы, используя DataContract.Существуют риски, но вы всегда можете исключить нежелательные операции (например, UPDATE или DELETE таблица UserRole) через разрешения базы данных.Ваша служба WCF должна подключаться к базе данных с выделенной учетной записью, и эта учетная запись должна иметь только разрешения на выполнение своих задач (без CREATE или DROP, только SELECT из соответствующих таблиц и т. Д.).1012 * И, конечно, вы также можете защитить свое соединение WCF, чтобы остановить нежелательные соединения (см. Обзор безопасности WCF ).Одним из вариантов является требование проверки подлинности сертификата - только те пользователи, у которых есть соответствующий сертификат, смогут пользоваться службой.

...