【发布时间】: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