【问题标题】:Xamarin + WCF + SSL + Transport + CertificateXamarin + WCF + SSL + 传输 + 证书
【发布时间】:2023-03-03 09:51:01
【问题描述】:

我有一个使用异步/任务方法运行的 Net Framework 4.5 WCF 服务。它部署在有效的 URL 上,带有正确的 Digicert 证书,以确保域。我们有一个“客户端证书”,具有“一对一”映射,对于我们的“Winforms”应用程序来说一切正常。 现在,我们不想从我们的 Android/iOS Xamarin 项目中调用它。 我们知道 Xamarin 不支持 wsBinding,所以我们正在使用这个配置:

服务器

<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 

但是……什么都没有发生……超时……

服务器没问题。可以从 iOS 模拟器访问该 url。我们可以只使用“basicHttpBinding”,但是,我们想使用 SSL+客户端证书。

有什么想法吗?现在我被困住了。

【问题讨论】:

  • 我不认为让所有手机都带有证书文件是一个好主意,尤其是因为这个文件必须有私钥。 Xamarin 大学有一个关于 Auth 的视频,他们讨论了所有可能的场景。如果您可以访问它,我建议您观看它。此外,要为 Xamarin 创建代理,您应该使用 Silverlight 工具或从 VS Studio 中进行。 ASASK svcutil 代理不适合 Xamarin。我从 VS 生成所有代理。
  • @YuriS 虽然我没有考虑反编译风险,但我理解你的观点。可悲的是,我将不得不使自己符合 basichttpbinding,因为我没有更好的选择
  • 你可以使用用户名/密码验证来代替证书吗?
  • @YuriS 我使用了 Silverlight 工具,并编写了一对我们需要的 Sinc 方法,现在代理工作得更好,至少我们可以使用安全传输。由于我不能使用用户名/密码,我将使用“令牌系统”,到期时间等。感谢您的建议,完成后我会回答这个问题,

标签: c# ssl xamarin https basichttpbinding


【解决方案1】:

浪费更多的努力是没有价值的。到目前为止,WCF Xamarin 非常短。 我必须满足于 HTTPs 和基本的传输安全性(security mode="Transport")。

我必须使用那个 Wcf 服务......但是,如果你,可怜的人类,正在阅读这个之前的新开发,请使用 REST 服务。他们从 Xamarin 获得了更好的支持。

【讨论】:

  • 您对从哪里开始有任何指示吗?此外,REST 是否像 WCF 一样舒适,我不必为每种数据类型创建自己的错误处理、序列化、回调等?
  • 当然,如果您觉得使用 WCF 很舒服,您可能会认为 REST 更“手动”,但实际上并不难。这在很大程度上取决于服务的“复杂性”。 docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/…
  • 我以前用过 REST。我只是懒惰。 (不应该每个程序员都懒惰吗?)几年前我开始创建类似我自己的 WCF over REST 错误处理和更好的序列化支持,几天后放弃了,但它仍然不能令人满意地工作。我将在 Xamarin 论坛中寻找更多指示。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
相关资源
最近更新 更多