2016-10-28 1 views
2

J'ai un service WCF Net Framework 4.5, qui s'exécute avec des méthodes async/task. Il est déployé sur une URL valide, avec un certificat Digicert correct, assurant le domaine. Nous avons un "certificat client", avec un mapping "one-to-one", et tout est ok pour nos applications "Winforms". Maintenant, nous ne voulons pas l'appeler à partir de nos projets Android/iOS Xamarin. Nous savons que Xamarin ne soutient pas wsBinding, donc nous utilisons cette config:Xamarin + WCF + SSL + Transport + Certificat

serveur

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

Nous avons créé un proxy à partir Svcutil.exe, nous avons de mettre en œuvre manuellement les méthodes asynchrones, création de chaîne, car Xamarin ne prend pas en charge les liaisons dinamic, etc.

Le proxy pour notre application client Xamarin, il est donc invoqué:

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 

Mais ... rien ne se passe ... le temps ....

Le serveur il est correct. L'URL est accessible depuis l'émulateur iOS. Nous pouvons l'utiliser avec seulement "basicHttpBinding", mais nous voulons utiliser SSL + Client Certificate.

Des idées? Maintenant je suis coincé.

+0

Je ne pense pas que ce soit une bonne idée d'avoir tous les téléphones avec des fichiers de certificat en particulier parce que ce fichier doit avoir des clés privées. L'université Xamarin a une vidéo sur Auth et ils discutent de tous les scénarios possibles. Si vous avez accès à cela, je suggère de le regarder. Aussi, pour créer un proxy pour Xamarin, vous devez utiliser l'outil Silverlight ou le faire depuis VS Studio. Les proxys ASASK svcutil ne sont pas bons pour Xamarin. Je génère tous les proxies de VS. –

+0

@YuriS Bien que je ne pense pas à décompiler les risques, je comprends votre point de vue. Malheureusement, je vais devoir me conformer à basichttpbinding, car je ne reçois pas de meilleure alternative – Caveman

+1

pouvez-vous utiliser nom d'utilisateur/mot de passe auth au lieu de certs? –

Répondre

1

Il ne sert à rien de gâcher plus d'efforts. A présent, WCF Xamarin est très court. Je dois me contenter de HTTPs et d'une sécurité de transport de base (security mode = "Transport").

Je dois utiliser ces services Wcf ... Mais si vous, humain pathétique, lisez ceci avant un nouveau développement, utilisez les services REST. Ils ont une forme de soutien beaucoup mieux Xamarin.