2016-10-28 5 views
2

비동기/작업 방법으로 실행되는 Net Framework 4.5 WCF 서비스가 있습니다. 올바른 URL에 올바른 Digicert 인증서가 배포되어 도메인을 보증합니다. 우리는 "일대일"매핑을 가진 "클라이언트 인증서"를 가지고 있으며, "Winforms"어플리케이션을위한 모든 인증을 가지고 있습니다. 이제 Android/iOS Xamarin 프로젝트에서 호출하지 않을 것입니다. 다음, 우리가 수동으로 비동기 메소드를 구현해야, 우리는 svcutil.exe에에서 프록시를 생성Xamarin + WCF + SSL + 전송 + 인증서

서버

<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> 

: 우리는 자 마린은 wsBinding를 지원하지 않는 것을 알고, 그래서 우리는이 설정을 사용하는 것 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 + 클라이언트 인증서를 사용하려고합니다.

아이디어가 있으십니까? 지금 나는 붙어있다.

+0

특히이 파일에 개인 키가 있어야하므로 모든 전화에 인증서 파일이있는 것이 좋습니다. Xamarin 대학은 Auth에 관한 비디오를 가지고 있으며 가능한 모든 시나리오에 대해 논의합니다. 당신이 그것에 접근 할 수 있다면 나는 그것을 지켜 볼 것을 제안한다. 또한 Xamarin 용 프록시를 만들려면 Silverlight 도구를 사용하거나 VS Studio에서 사용해야합니다. ASASK svcutil 프록시는 Xamarin에 좋지 않습니다. VS에서 모든 프록시를 생성합니다. –

+0

@ 유리 나는 위험을 decompiling 생각하지 않을거야, 나는 당신의 견해를 이해합니다. 슬프게도 나는 더 나은 대안을 얻지 못하기 때문에 basichttpbinding을 스스로 준수해야합니다. – Caveman

+1

certs 대신 username/password auth를 사용할 수 있습니까? –

답변

1

더 많은 노력을 망칠 가치가 없습니다. 지금까지 WCF Xamarin은 매우 짧습니다. HTTPs와 기본 전송 보안 (보안 모드 = "전송")으로 해결해야합니다.

나는 Wcf 서비스를 사용해야합니다. 그러나 만약 당신이 불쌍한 사람이라면이 새로운 개발을 읽기 전에 REST 서비스를 사용하십시오. 그들에게는 Xamarin이라는 훨씬 더 나은 지원 양식이 있습니다.