.NET Compact Framework, служба WCF, сжатие и DIGEST-аутентификация - PullRequest
4 голосов
/ 15 июня 2011

Я пытаюсь объединить ряд функций, что становится все труднее из-за ограничений .NET Compact Framework.

В частности, у меня есть сервис WCF, и я пишу для него клиент мобильного устройства. Подвох? Я хочу использовать какое-то сжатие данных (из-за очень медленного модема, подключенного к указанному устройству) и HTTP DIGEST-аутентификацию (которая уже существует на сайте, где размещается служба WCF).

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

Я, однако, борюсь с HTTP DIGEST. Я понятия не имею, как добавить эту функцию.

Раньше я не использовал сжатие и поэтому подключался к службе WCF с использованием SOAP, используя простую ссылку на WebService, и для добавления HTTP DIGEST мне пришлось переопределить метод GetWebRequest и вручную добавить необходимые заголовки. На этот раз сгенерированные классы, похоже, дают очень мало свободы, и я мало что могу переопределить. Кроме того, кажется, что все параметры безопасности или аутентификации предназначены для SSL, а не для таких базовых схем аутентификации.

Подведем итог: как создать клиент WCF с использованием сжатия и HTTP DIGEST-аутентификации с использованием .NET Compact Framework?

EDIT: Вот код, который я сейчас получил:

        System.ServiceModel.Channels.CustomBinding customBinding = new System.ServiceModel.Channels.CustomBinding();
        CompressionMessageEncodingBindingElement compressionBindingElement = new CompressionMessageEncodingBindingElement();
        customBinding.Elements.Add(compressionBindingElement);
        HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
        customBinding.Elements.Add(httpBindingElement);
        EndpointAddress endPoint = new EndpointAddress("http://localhost:5100/Service.svc");
        ServiceClient client = new ServiceClient(customBinding, endPoint);

Я подозреваю, что мне как-то нужно добавить функцию HTTP DIGEST в класс CustomBinding, но я не знаю как.

Я подозреваю, что должен также отметить, что, хотя я использую .NET Compact Framework 3.5, я создаю приложение Windows CE. Поэтому я не стал загружать SDK для Windows Mobile 6. Если эти SDK добавляют больше функций, которые могут использоваться в приложениях Window CE и требуются для работы HTTP DIGEST, пожалуйста, дайте мне знать.

Ответы [ 3 ]

1 голос
/ 12 октября 2012

В итоге мы отключили DIGEST-аутентификацию для устройств, работающих под управлением .NET CF.Это не так безопасно, но мы посчитали, что данные, отправляемые и извлекаемые устройствами, работающими с .NET CF, в нашем случае не ТАК чувствительны, поэтому все, что нам действительно нужно сделать, это проверить.

0 голосов
/ 26 сентября 2013

Единственный способ добиться этого - использовать HttpWebRequest (вручную) и указать ClientCredentials вместо сгенерированных классов из NetCFSvcUtil, который не поддерживает аутентификацию.Единственная спецификация WS-Security, которую он поддерживает для CF с WCF, - это эффективное использование защиты сообщений с обменом взаимными сертификатами.(У которого, кстати, есть утечка памяти, которую мы с коллегой обнаружили: http://connect.microsoft.com/VisualStudio/feedback/details/727247/native-memory-leak-in-wcf-proxy-client-with-mutual-certificate-security-in-net-compact-framework-3-5-on-windows-ce-6-0)

Обратите внимание, сгенерированная CFClientBase также имеет утечку памяти, которую можно обойти, см .: http://geekswithblogs.net/GruffCode/archive/2013/03/31/memory-leak-in-cfclientbaselttgt-service-proxy-for-compact-framework-.net.aspx

Для справки: Подмножество WCF, поддерживаемое NetCF: http://blogs.msdn.com/b/andrewarnottms/archive/2007/08/21/the-wcf-subset-supported-by-netcf.aspx

0 голосов
/ 15 июня 2011

Если клиент работает на .NET Compact Framework 3.5, вы можете использовать WCF для вызова службы и использовать встроенную поддержку аутентификации дайджеста HTTP, не требуя SSL.

Вот как можно программно настроитьклиент WCF для использования дайджест-аутентификации с BasicHttpBinding :

var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Digest;
var endpoint = new EndpointAddress("http://server/myservice");
var client = new MyServiceClient(binding, endpoint);

// We have to set the actual credentials on the client proxy object
// before invoking the service:
client.ClientCredentials.HttpDigest.ClientCredential.UserName = "me";
client.ClientCredentials.HttpDigest.ClientCredential.Password = "password";

try
{
    client.MyServiceOperation();
    client.Close();
}
catch
{
    client.Abort();
}

Связанные ресурсы:

...