2016-10-28 8 views
2

У меня есть Net Framework 4.5 WCF Service, работающий с методами async/task. Он развертывается по допустимому URL-адресу с правильным сертификатом Digicert, гарантируя домен. У нас есть «клиентский сертификат», с отображением «один к одному», и все в порядке для наших приложений «Winforms». Теперь мы не будем называть это из наших проектов Android/iOS Xamarin. Мы знаем, что Xamarin не поддерживает wsBinding, поэтому мы используем этот конфиг:Xamarin + WCF + SSL + Transport + Certificate

сервера

<system.serviceModel> 
    <services> 
     <service 
      name="serviceWCF.nameService" 
      behaviorConfiguration="behavior_base"> 
     <endpoint address="" 
        binding="basicHttpBinding" 
        bindingConfiguration="transport" 
        contract="serviceWCF.nameInterfaceService" /> 
     </service> 
    </services> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="transport"> 
      <security mode="Transport" > 
      <transport clientCredentialType="Certificate"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="behavior_base"> 
      <serviceMetadata httpsGetEnabled="true" httpsGetUrl=""/> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 

Мы создали прокси из SvcUtil.exe, то есть осуществлять вручную методы асинхронных, канал, потому что Xamarin не поддерживает динамические привязки и т. д.

прокси для нашего клиента приложения Xamarin, он вызывается так:

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); 
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
AddressHeader addressHeader2; 
AddressHeader[] addressHeaders; 
EndpointAddress endpoint; 

addressHeader2 = AddressHeader.CreateAddressHeader("nameapp_iOS", "https:\\URL_WCF_Service.svc", 0); 
addressHeaders = new AddressHeader[]{ addressHeader2}; 
endpoint = new EndpointAddress(new System.Uri("https:\\URL_WCF_Service.svc"),addressHeaders); 

System.Security.Cryptography.X509Certificates.X509Certificate2 oCert; 
oCert = new System.Security.Cryptography.X509Certificates.X509Certificate2(System.IO.File.ReadAllBytes("CertBundle.pfx"), "pass"); 

Service_MovilClient oProxy = new Service_MovilClient(binding, endpoint); 
Service_MovilClient oProxy.ClientCredentials.ClientCertificate.Certificate = oCert 

... Но ничего не происходит ... тайм-аут ....

Сервер это нормально. URL-адрес можно получить из эмулятора iOS. Мы можем использовать его только с «basicHttpBinding», но мы хотим использовать SSL + Client Certificate.

Любые идеи? Теперь я застрял.

+0

Я не думаю, что это хорошая идея иметь все телефоны с файлами сертификатов, особенно потому, что этот файл должен иметь закрытые ключи. В университете Xamarin есть видео об Auth, и они обсуждают все возможные сценарии. Если у вас есть доступ к нему, я предлагаю посмотреть его. Кроме того, чтобы создать прокси для Xamarin, вы должны использовать Silverlight-инструмент или сделать это из VS Studio. Прокси-серверы ASASK svcutil не подходят для Xamarin. Я генерирую все прокси из VS. –

+0

@YuriS Наверху Я не думаю о декомпиляции рисков, я понимаю ваше мнение. К сожалению, мне придется подчиниться basichttpbinding, так как я не получаю никакой лучшей альтернативы – Caveman

+1

вы можете использовать имя пользователя/пароль auth вместо сертификатов? –

ответ

1

Это бесполезно портить больше усилий. К настоящему времени WCF Xamarin очень коротка. Я должен соглашаться с HTTP и базовой транспортной безопасностью (режим безопасности = «Транспорт»).

Я должен использовать эти службы Wcf ... Но если вы, жалкий человек, читаете это раньше новой разработки, используйте службы REST. У них намного лучшая форма поддержки Xamarin.

 Смежные вопросы

  • Нет связанных вопросов^_^