Использование службы WCF в MonoTouch с аутентификацией

Я использую клиент службы WCF, сгенерированный slsvcutil из инструментария Silverlight версии 4. Я также пробовал версию 3 с теми же проблемами. Когда я использую экземпляр клиента, работающий по http без учетных данных пользователя, он работает без проблем. Но мне нужно переключиться на https для производительных серверов и отправить учетные данные пользователя, которые жестко запрограммированы для моего приложения. Я использую для этого следующий код:

        var binding = new BasicHttpBinding (BasicHttpSecurityMode.TransportCredentialOnly);         
        var endpoint = new EndpointAddress (AppSettings.FlareEndPoint);
        _service = new TopicAnalystAPIClient(binding, endpoint);
        _service.ClientCredentials.UserName.UserName = "xxx";
        _service.ClientCredentials.UserName.Password =  "xxx";

Когда я вызываю метод этой службы, указывающий на http без аутентификации, он работает. Когда я использую этот код против http/https с учетными данными, я получаю исключение «Произошла ошибка при обработке веб-запроса: код состояния 401 (неавторизованный): неавторизованный». Я проверил правильность учетных данных и могу открыть ссылку на службу в своем браузере. Я также пробовал несколько комбинаций значений http/https и SecurityMode. Я также пробовал это на четырех разных серверах, всегда с тем же результатом.

В чем может быть проблема?


person Scarlaxx    schedule 12.07.2011    source источник
comment
См. мой связанный вопрос: stackoverflow.com/questions/6667030/   -  person Krumelur    schedule 13.07.2011


Ответы (1)


Возможно множество перестановок. BasicHttpSecurityMode.TransportCredentialOnly должен использоваться без SSL [1] с использованием самого HTTP. Это означает, что сервер отправит клиенту один (или несколько) методов аутентификации (например, базовый, дайджест, ntlm), и Mono (включая MonoTouch) должен поддерживать большинство из них.

Возможно, что линкер (если используется) удаляет один из них. В этом случае вы можете попробовать собрать и протестировать без компоновки (или пропустить компоновку System.Net.dll).

Также возможно, что метод аутентификации, на котором настаивает служба, не поддерживается. Вы можете узнать, какой из них используется, запустив сетевую трассировку (например, wireshark) или, может быть, он появится более подробно в журнале сервера (вместе с ошибкой 401).

[1] http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpsecuritymode%28v=vs.95%29.aspx

person poupou    schedule 25.07.2011