У меня есть 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.
Любые идеи? Теперь я застрял.
Я не думаю, что это хорошая идея иметь все телефоны с файлами сертификатов, особенно потому, что этот файл должен иметь закрытые ключи. В университете Xamarin есть видео об Auth, и они обсуждают все возможные сценарии. Если у вас есть доступ к нему, я предлагаю посмотреть его. Кроме того, чтобы создать прокси для Xamarin, вы должны использовать Silverlight-инструмент или сделать это из VS Studio. Прокси-серверы ASASK svcutil не подходят для Xamarin. Я генерирую все прокси из VS. –
@YuriS Наверху Я не думаю о декомпиляции рисков, я понимаю ваше мнение. К сожалению, мне придется подчиниться basichttpbinding, так как я не получаю никакой лучшей альтернативы – Caveman
вы можете использовать имя пользователя/пароль auth вместо сертификатов? –